デバイスマネジャーを開いてみたら
ほかのデバイス内にある「Santiago DFU」のドライバが無いみたい。
プロパティを開きドライバの更新を行うをやってもドライバ見つからず。
Arduino IDEのツール>ボード>ボードマネージャーで
R4のドライバを最新の1.3.1ではなく1.2.1をインストールしたら書き込めた。
最新版は何か問題があるのか?とりあえず書き込めてよかった。
デバイスマネジャーを開いてみたら
ほかのデバイス内にある「Santiago DFU」のドライバが無いみたい。
プロパティを開きドライバの更新を行うをやってもドライバ見つからず。
Arduino IDEのツール>ボード>ボードマネージャーで
R4のドライバを最新の1.3.1ではなく1.2.1をインストールしたら書き込めた。
最新版は何か問題があるのか?とりあえず書き込めてよかった。
A0に3V入力しているのにanalogReadすると値が580。
調べてみたら電源5VをVCCに繋いでいた。
RAWに繋ぎ直したら直った。
1台なら
serial.Serial("/dev/ttyACM0", 115200)
2台目は
serial.Serial("/dev/ttyACM1", 115200)
となる。
「0」と「1」は差し込む位置によって決まる。
RaspberryPi4Bだと
USB3上段→USB3下段→USB2上段→USB2下段
の順でチェックをしているのかも。
例)
ttyACM0とするArduinoをUSB3上段
ttyACM1とするArduinoをUSB2上段
にする。
'XXX'が関数名であれば、その関数を実行した位置では、まだXXXは定義されていない。
XXX関数を実行箇所より前に持ってくる。
タブで管理しているなら左に来るようにタブ名に数値を入れるなどして調整する。
※タブ位置はすぐには反映されない。ファイルを開き直す必要あり。
宣言時配列に[]を付け忘れると出る。
誤)
int secondsList = {0,0};
正)
int secondsList[] = {0,0};
または
int secondsList[2] = {0,0};
RaspberryPiとArduinoを接続して動作テストしていたら
backend terminated or disconnected.
を出してPythonが落ちた。
Arduinoの入力を行うと良く落ちるので、Arduinoが原因かと色々したが直らない。
今まではこのような事がなかったので、今日初めて使用する
Raspberry Pi B+用T型I/O延長基板
を調べてみたら差す向きを間違えてる。。。
そんな訳でラズパイに繋いでいるRTCなんか全く違うところに差しちゃってました。
見た事ないエラーで慌てずに冷静になってから繋いでいるピンを確認しましょう。
私はこれで3時間無駄にしました。
Python2では
ser = serial.Serial( "/dev/ttyACM0" , 115200 , timeout = 0.01)
〜〜省略〜〜
received = ser.read_until("k")
str_value = re.sub(r'\D' , '' , received)
num = int(str_value)
で"k"区切りになっていた値を受け取れていたのにPython3では
NameError : name 'received' is not defined
と出る。。。
調べてみたら「python3では、文字列とバイト列の区別が明確になりました。」との事。
どうやらこいつの影響っぽい。
Python2
received = ser.read_until("k")
を
Python3
received = ser.read_until(b'\x6b')#kをbytes型で指定
これだと b'a200k' のような状態なので、これをそのままstr型の文字列に変換して
余計なものを取る。
received = str( ser.read_until(b'\x6b') )
received = received[ 2 : len(received)-1 ]
とっても後味悪い方法に。。
以下、参考にしたサイト
python3のbytes型とstr型の比較と変換方法
Python3での文字列のstr型とbytes型のまとめ
Raspberry Pi と Arduino でUSBシリアル通信(複数の値を送受信)(第二弾)
Serial.print(0x7E,BYTE);
じゃなくて
Serial.write(0x7E);
を使う。//[0]スタートバイト
Serial.write(0x7E);
//フレーム長バイト数チェックサムを含まない。
//[1]上位
Serial.write(0x00);
//[2]下位
Serial.write(0x10);
//[3]フレームタイプ
Serial.write(0x10);
//[4]応答用フレームID
Serial.write(num);
//64bitアドレス コーディネーター
//[5-8]
Serial.write(0x00);
Serial.write(0x00);
Serial.write(0x00);
Serial.write(0x00);
//[9-12]
Serial.write(0x00);
Serial.write(0x00);
Serial.write(0x00);
Serial.write(0x00);
//[13-14]16bitアドレス コーディネーター
Serial.write(0x00);
Serial.write(0x00);
//[15]ブロードキャストホップ数
Serial.write(0x00);
//[16]オプション
Serial.write(0x00);
//[17]RFデータ1
Serial.write(rf1);
//[18]RFデータ2
Serial.write(rf2);
//Serial.write(0xF0);
//[19]チェックサム
long sum = 0xff - ((0x10 + num + rf1 + rf2) & 0xff);
Serial.write(sum);
delay(10);
参考書籍:XBeeで作るワイヤレスセンサーネットワーク (Make: PROJECTS)//A4・A5・A6・A7をデジタル出力でHIGH
DDRC = B11110000;
PORTC = B11110000;
しかし、A6・A7がHIGHにならない。int LED[2][2] ={{2,3},{4,5}};
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
pinMode(LED[i][j], OUTPUT);
digitalWrite(LED[i][j], HIGH);
}
}
int LIMITSWITCH_IN = 2;
boolean limitSwitchBoo;
int CHATTERING_TIME = 10;
unsigned long chatteringTimeStamp = millis();
unsigned long nowMillis;
void setup() {
limitSwitchBoo = digitalRead(LIMITSWITCH_IN);
Serial.begin(9600);
pinMode(LIMITSWITCH_IN, INPUT);
}
void loop() {
nowMillis = millis();
//最低10ms経っていないと受け付けない。
if ((nowMillis - chatteringTimeStamp) > CHATTERING_TIME) {
//【LOW】HIGHからLOWに切り替わった
if ((limitSwitchBoo == HIGH) && (digitalRead(LIMITSWITCH_IN) == LOW)) {
limitSwitchBoo = LOW;
chatteringTimeStamp = nowMillis;
limitLowAction();
//【HIGH】LOWからHIGHに切り替わった
} else if ((limitSwitchBoo == LOW) && (digitalRead(LIMITSWITCH_IN) == HIGH)) {
limitSwitchBoo = HIGH;
chatteringTimeStamp = nowMillis;
limitHighAction();
}
}
}
void limitLowAction() {
Serial.println("LOW");
}
void limitHighAction() {
Serial.println("HIGH");
}