投稿日: May 13, 2019 4:15:1 PM
魔がさして買ったYún miniですが、なんか感触的には悪くないのでしっかり使えるようにしておきたいな。
ということで、どうやってLinuxと32u4でやり取りすればいいの? から。
基本はArduino公式のこのドキュメント。
全体的な傾向として32u4側のドキュメントは充実しているけれど、OpenWrt側でどうすれば良いのかってのがあまり触れられていない印象。
#include <Console.h>
const int ledPin = 13; // the pin that the LED is attached to
int incomingByte; // a variable to read incoming serial data into
void setup() {
// initialize serial communication:
Bridge.begin();
Console.begin();
while (!Console){
; // wait for Console port to connect.
}
Console.println("You're connected to the Console!!!!");
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
}
void loop() {
// see if there's incoming serial data:
if (Console.available() > 0) {
// read the oldest byte in the serial buffer:
incomingByte = Console.read();
// if it's a capital H (ASCII 72), turn on the LED:
if (incomingByte == 'H') {
digitalWrite(ledPin, HIGH);
}
// if it's an L (ASCII 76) turn off the LED:
if (incomingByte == 'L') {
digitalWrite(ledPin, LOW);
}
}
delay(100);
}
まず上のリンクにあるサンプルコード。32u4用、Arduino IDEでコンパイルして書き込んでおく。
とりあえずこれはOpenWrtにsshで接続して、そこから更にtelnet localhost 6571と接続すると動作する。これもリンク先の説明にあるとおり。
じゃあ、これをPythonなりなんなりからやるにはどうすればいいかなーってとこです。
答えとしてはこんな感じ。
import telnetlib
import time
t = telnetlib.Telnet("localhost",6571)
print( t.read_some() )
while True:
t.write("H")
time.sleep(0.5)
t.write("L")
time.sleep(0.5)
なんかむっちゃ回りくどいことしてる気がするかもしれないけど、これはやってることが単純だからであって、例えばサーボを利用するときとか、Pythonからはコマンド一つ送ったらあとは32u4側が処理してくれる、Python側ではその間に他のことやってられるわけなのでやってることが複雑になればなるほど強い。と思う。
現在はネットワーククライアントとして動作させているんですけども、アクセスポイントとか、ゲートウェイとかいろいろできるっぽいので(まあLinuxですし出来ないとおかしい気もしますけど)なんかいい感じにどうにかできればと思います。
ネットワークの設定を環境によってかんたんに切り替えられる仕組みとかも欲しいところです。
何にしてもYún、思ったより面白い。