元高専生のロボット作り

元高専生のロボット作り

主にプログラミング, 電子系について書きます。たまに機械系もやります。メモ代わりの記事ばっか書きます

pythonとArduino, mbedでシリアル通信する

pythonで計算した後、モーターを動かすためにArduinoに値を送信したくなりました。

1バイトのデータとかだったら楽勝なんですけど、小数を送りたいとか、この値がどんなデータなのかとか送信するには少しだけ複雑なことをする必要がありそうです。

今回はpythonArduinoのどちらにもレジスタを作って、レジスタを指定してそこに値を送信するということをやってみます。

コードはgithub
python
github.com


Arduino
github.com


mbed対応させました。(cppファイルにサンプルあります。)
os.mbed.com



python側の方がけっこう苦労したんですけど、データを送信するときはバイト文字列にしたりしなきゃいけないんですよ。
そのあたりの処理を行っているのがwriteDataとreadDataです。


pythonのコードが送信用となっていて、レジスタの0x10, 0x20 0x30, 0x40に0~255の間を上下するように値を送信しています。
Arduinoは、12番ピンがレジスタ0x10の値に応じてPWM出力します。
mbedは、レジスタ0x10の値をprintfしています。teratermで確認できるかと思います。
mbedのサンプルコードははmbed同士で通信するためのものです。
pythonと通信するならば、teratermが使えないので、LEDを使いましょう。
こんな感じ

#include "mbed.h"
#include "PacketSerial.h"
 
int32_t Registar[128] = {};
PacketSerial device(USBTX, USBRX, Registar);
 
int main()
{
    BusOut leds(LED1, LED2, LED3, LED4);
    while(1)
    {
        leds = Registar[0x10];
    }
}


終了はprintfで。。。


パケットに関してはこちらを参考に、パケットにレジスタ指定を追加しました。
Arduinoでバイナリ送受信のシリアル通信をするときのパケットの構造