2009年11月27日

avrdude: stk500_getsync(): not in sync: resp=0x00

最近、ハマっている8bitワンボードマイコン「arduino Duemilanoveですが、プログラム書き込みの際にタイトルのようなエラーが出新規書き込みができなくなってしまった。正確には下記のエラー

avrdude: stk500_getsync(): not in sync: resp=0x00
avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x51

既に書き込んでいるプログラムは動いているので、壊れたわけではなさそう。あくまで新規書き込みができない。

日本語、英語ともにいろいろとググッては見た。同じ問題で困っている人がたくさんいるようだが、決定的な解決方法が見当たらない。

しかし、イーサネットシールドを取り付けると直ってしまった。

ネット上で見つかった解決方法はこんな感じ・・・ATMEGA328のチップを外すと直るとか、しばらく使わずにおいておくと直っていたとか、IDEの再起動で直ったとか、シリアルポートのドライバを再インストールで直ったとかありました。

ちなみにどれを試しても直らなかった。試してないけど
ATMEGA328のブートローダー再書き込みで直ったという報告もありました。

今回のケースで、もちろんマイコンボードの選択ミスはあり得ない。何だったのだろうと思っていたら、状況再発。

イーサネットシールドを取り外した後、また同様のエラーが止まらない。いろいろやってみたが、十分に調べる前にまた直ってしまった。今度は、イーサネットシールドなしでも復旧。何をやったか一応メモしておく。

「arduino Duemilanove」のリセットボタンを押しながら、USBケーブルを抜いて、さらに押しながら再度挿入。

リセットボタンは、かなり長く押すのがコツ。10秒とか

とりあえず今回はこれで直った。う〜ん・・・結局わからん。

これだけは言える。とにかく直った。
今はそれだけでいいのだ。

追記、上記のとおり一度直った後、かなり時間を空けて、別の基板で再発、やはり
リセットボタンを押しながら、USBケーブルを抜いて、さらに押しながら再度挿入で普及しました。

2010年2月現在。私の場合。やはり、この方法で直っています。

電気的な問題っぽいですね。ところで、皆さんこの方法で直ってますか?
ラベル:Arduino
posted by love4nature at 23:00| Comment(13) | TrackBack(0) | 趣味の部屋 | このブログの読者になる | 更新情報をチェックする

arduino Wake On LAN リピーターの作成

2012年11月22日更新:
 arduino WOL リピータのスケッチを最新の開発環境用に修正・更新


※なんだかよく分からないけど、arduino WOLリピーターを作りたい方は、こちらの初心者用の説明をどうぞ

職場のネットワークに勝手にルーターを追加することはできませんが、既存のルーターのポートを開けるくらいはできる。

Wake On LAN リピータ」を日本で買って送ってもらうよりは、こちらでも購入可能な「arduino+ethernet shield」を選択したわけです。

リピータ機能のみのものとそれに加え、可変抵抗器で登録した端末からターゲットを選択して押しボタン押下でマジックパケットを送信する機能を持たせたものを作りました。

この「arduino WOL リピーター」のIPは、192.168.1.200となっていますが、任意で変更してください。受信ポートは、7番になっていますが、マジックパケット送信アプリに応じて任意で変更してください。

私は、sndmagic (For Windows NT) Latest version 0.2 を使わせてもらっています。下記サイトから入手可能
http://www.st.rim.or.jp/~yumo/pub/sndmagic_chglog.html

このソフトを使う場合は、sndmagic.exeとmagic.exeをパスがとおっている場所(C:\Windows\system32)などにコピーして使うと、バッチファイルのクリックのみで、対象PCの遠隔電源オンが可能で便利です。

使い方は、対象パソコンがWOLに対応している場合、たとえば自宅のPCから、職場のグローバルIPのポート7番(前述の
sndmagicはポート7番に飛ばします)にマジックパケットを飛ばします。問題なく対象PCの電源が入ります。

当然ですが、
職場のルーターには、UDPの7番ポートをarduino WOL リピーター(192.168.1.200)に転送する設定が必要です。

対象パソコンがWOLに対応していない場合は、
arduino WOL リピーター & スイッチャー」をご覧ください。

以下にスケッチです。「arduino WOL リピーター」は、bjoern / arduino_oscというライブラリを利用してUDPを取り扱っています。リンクページからarduino_osc-tip.zipというファイルをダウンロードして、中にあるEthernet及び
Stringフォルダのファイルを、arduino IDEのフォルダ「\hardware\libraries\Ethernet」及び「\hardware\libraries\String」にコピーしてください。

あとは「arduino」と「ethernet shield」を合体させて、このスケッチを転送するだけで動作します。


// Wake On Lan リピーター
// http://yutakalife.net/article/133960795.html
// 販売などの商用利用はご遠慮ください
// Copyright love4nature All Rights Reserved.

#include <WString.h>
#include <Ethernet.h>
#include <UdpRaw.h>

// イーサネットの設定
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // MAC address
byte ip[] = { 192, 168, 1, 200 }; // Arduino のIP address
byte gw[] = { 192, 168, 1, 1 }; // Gateway IP address
int localPort = 7; //local port to listen on

// ターゲットのブロードキャストアドレスを指定
byte targetIp[] = { 192, 168, 1, 255};
int targetPort = 8000;

#define MAX_SIZE 192
// パケットサイズの最大値を設定
byte packetBuffer[MAX_SIZE]; // 受信パケット用バッファ
int packetSize; // 受信パケットのサイズが格納される
byte remoteIp[4]; // 送信元のIPアドレスを格納
unsigned int remotePort; // 送信元のポート番号を格納

int i;

void setup() {

Ethernet.begin(mac,ip,gw);
UdpRaw.begin(localPort);
Serial.begin(38400);

}

void loop() {

// if there's data available, read a packet
if(UdpRaw.available()) {
packetSize = UdpRaw.readPacket(packetBuffer,MAX_SIZE,remoteIp,(uint16_t *)&remotePort);

Serial.print("Received packet of size ");
Serial.println(abs(packetSize));

Serial.print("From IP ");
for(i=0; i<3; i++) {
Serial.print(remoteIp[i],DEC);
Serial.print(".");
}
Serial.print(remoteIp[3],DEC);

Serial.print(" Port ");
Serial.println(remotePort);

if(packetSize < 0) {
// if return value <0 the packet was truncated to fit into our buffer
Serial.print("ERROR: Packet was truncated from ");
Serial.print(packetSize*-1);
Serial.print(" to ");
Serial.print(MAX_SIZE);
Serial.println(" bytes.");
}

Serial.println("Contents:");
for(i=0; i<min(MAX_SIZE,abs(packetSize)); i++) {
Serial.print(packetBuffer[i],HEX);
Serial.print(" ");
}
Serial.println("");

// マジックパケットを送信
UdpRaw.sendPacket(packetBuffer,packetSize,targetIp,targetPort);
Serial.println("Start port forwarding to broadcast address:");
for(i=0; i<3; i++) {
Serial.print(targetIp[i],DEC);
Serial.print(".");
}
Serial.print(targetIp[3],DEC);
Serial.println("");
Serial.println("Done!");
}
// 0.01秒待つ
delay(10);

}
posted by love4nature at 01:00| Comment(3) | TrackBack(0) | 趣味の部屋 | このブログの読者になる | 更新情報をチェックする
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。