ねこでじ(Nekodigi)

Nekodigi’s diary

学習中の気づきをまとめています。応援よろしくお願いします

【Scratch×Arduino】ScratchでArduinoを動かす。

注意

まだ試作段階で、接続が切れることも多いので、参考程度にご覧ください。ブロックはArduinoのコードとほとんど同じです。

作り方・コード

ArduinoでStringを扱うのはちょっと重たいのですが、解読しやすいので、今回はStringを使っています。Arduinoのコードはこちらです。

Pythonのコードはこちらです。ThreadingでArduinoと通信し、Queueを使って順番に実行しています。無理やりつないだ感じが否めないです。練習が必要…

Scratchのコード(index.js)はこちらです。scratch-guiの方も変更する必要があります。こちらを参考にしてください。

qiita.com

仕組み

少しややこしくなるのですが、Pythonを通訳として、ArduinoとScratchを繋げています。クライアントのJavaScriptからは、シリアル通信にアクセスできないため、このような構造になっています。

 シリアル WebSocket

ArduinoPython⇔Scratch

非常にややこしいことに、Python、Scratchは、それぞれデータを格納するバッファを持っています。通信には時間がかかるのですが、Scratchは終了まで待ってくれません。もっと効率的な方法もあると思います。あくまで、今回のプログラムは、一つの例としてとらえてください。

PythonArduinoの通信は、

command,index,value

と言う文字列を送るようになっていて、commandで指定した、関数に、index、valueが渡されて、Arduinoで実行されます。byteで送るのは断念しました。

commandの表はこちらです。各自で追加することもできます。

command Arduinoで呼ばれる関数
0 pinMode(index, value)
1 digitalWrite(index, value)
2 analogWrite(index, value)
3 digitalRead(index)
4 analogRead(index)
5 すべての入力を取得

(例)

digitalWrite(0,1);を実行したいときは、

1,0,1というコードを送信します。

ArduinoPythonの通信は、

i,j,value/

となっているのですが、/で区切っているので、まとめて送ってバッファに保存することができます。ここでの、i、jは、Pythonのバッファの場所を指定するものだと考えてください。

digitalRead > i=0, j=pin

analogRead > i=1, j=pin

Scratch⇒Pythonの通信は、

command/data

command 解説
send/data Arduinoにdataを送信
delay/data Pythonがdata秒待つ
get/ Scratchにset/バッファを送信
getAt/i,j

ScratchにsetAt/i,jのバッファの値を送信

これだけ見て、やって下さいというのも酷だと思うのですが、あまりいい表現が見つかりませんでした。

Python⇒Scratchの通信は、

command 解説
set/data Scratchのバッファにdataをセット
setAt/i,j,data Scratchのバッファi,jにdataをセット