Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

systemdでRasPiにつないだArduinoのデータをシリアルからとる。

RasPiとArduinoをつないで、Arduinoのシリアルから情報を取得します。
Arduino側には、GPSロガー的なものを付けています。
shuzo-kino.hateblo.jp

実際のところ

ハードウェア

特に工夫もなく、USBコネクタにArduinoのUSBをつなぐだけ。
通常の電力供給だとギリギリっぽいので外部電源なり太いUSBハブを使うべきかと思われます。

ソフトウェア

コネクタのttyACM0にそのまま流れてくるので、そいつをよろしく自動起動スクリプトで拾ってあげる構成を考えます。

まず、こんな感じでautorun.shを設定。

$ cat autorun.sh
#!/bin/sh

cd /home/pi
cat /dev/ttyACM0 >> gpsdata.log

後で読み込むので実行権限を付けときます。

$ sudo chmod +x autorun.sh

さて、肝心の自動起動ですが……公式はsystemdを使えというとるので、したがいます。
もう、systemdが苦手とか言ってると今後の更新についてけない。

以下のような感じでautorun用のサービスを作成。

$ sudo cat /etc/systemd/system/autorun.service
[Unit]
Description=Auto Run for GPS on Arduino

[Service]
Type=simple
ExecStart=/home/pi/autorun.sh

[Install]
WantedBy=multi-user.target

試しに起動してみましょう。
systemctlコマンドでOK。

$ sudo systemctl start autorun.service

コマンド実行後、試しにリストをみると……ありますね。
以前導入した4Gpiのサービスと一緒に。

$ sudo systemctl list-units --type=service | head
  UNIT                               LOAD   ACTIVE SUB     DESCRIPTION          
  4gpi-networkmanager-helper.service loaded active running NetworkManager Helper for 4GPi
  4gpi-setup.service                 loaded active exited  4GPi Setup           
  alsa-restore.service               loaded active exited  Save/Restore Sound Card State
  alsa-state.service                 loaded active running Manage Sound Card State (restore and store)
  autorun.service                    loaded active running Auto Run for GPS on Arduino
  avahi-daemon.service               loaded active running Avahi mDNS/DNS-SD Stack
  bluealsa.service                   loaded active running BluezALSA proxy      
  bluetooth.service                  loaded active running Bluetooth service    
  console-setup.service              loaded active exited  Set console font and keymap

さて、このまんまだと次起動したときに動いてくれないので、自動起動を設定します。

$ sudo systemctl enable autorun.service
Created symlink /etc/systemd/system/multi-user.target.wants/autorun.service → /etc/systemd/system/autorun.service.

終わったら、再起動しましょう。

$ sudo reboot

つなぎなおしてプロセスを確認。
ちゃんと存在してますね。

$ sudo systemctl list-units --type=service | head | grep autorun
autorun.service                      loaded active     running       Auto Run for GPS on Arduino

改良すべき事項

何らかの事情で断線したり、ポート割付が異なった場合の対処がされてません。
確実に動くシステムを作りたい方はその辺りを改良する必要があるかと思います。