👋

買ったばかりのRaspberry PiからAmbientにデータを送る

2021/08/15に公開

*パソコンは mac を想定

  1. microSDカードを挿したカードリーダーを mac に挿す
  2. Raspberry Pi ImagerでOSを書き込む(20分ほどかかる)
  3. 一度 micro SD カードを抜き差しする
  4. /Volumes/boot としてマウントされる
  5. 以下のコマンドで ssh, WiFi 用の設定ファイルを用意する
$ cd /Volumes/boot
$ touch ssh
$ vi wpa_supplicant.conf
  1. vi で以下の内容を書き、ESC :wa で保存する
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP
network={
ssid="your_wifi_ssid"
psk="your_wifi_password"
key_mgmt=WPA-PSK
priority=1
}
  1. microSDカードを抜く
  2. ラズパイにmicroSDカードを挿して給電する
  3. コマンドプロンプトまたはターミナルでping raspberrypi.local、ネットワークに接続されていることを確認する。無線接続に失敗する場合、LANケーブルを挿して再度接続を確認する
  4. 2,3分待って mac から ssh pi@raspberrypi.local。パスワードはraspberry
  5. WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!と表示される時は vi ~/.ssh/known_hosts でraspberrypi.localの行を削除して保存する
  6. sshの接続が完了する
  7. sudo apt-get updateでパッケージマネージャを更新する
  8. sudo apt-get -y install python3-pip python3 git python-pip をインストールする
  9. sudo pip3 install pyserialでPythonのserialライブラリをインストールする。カレントディレクトリにserial.pyなどのファイルがあるとpyserialの呼び出しに失敗するので注意する
  10. ラズパイとArduinoをUSBケーブルで接続する
  11. Arduinoに〜〜〜のファームウェアを書き込む
  12. ls /dev/tty*でArduinoとの接続に使用しているポートを調べる。ttyAMA0、ttyACM0 などの値があればビンゴ
  13. vi get_value_by_serial.pyで以下の内容を書く
import serial
import time

def main():
    con=serial.Serial('/dev/tty****', 9600)
    print('connected.')
    while 1:
        str=con.readline() # byte code
        print (str.strip().decode('utf-8')) # decoded string

if __name__ == '__main__':
    main()
  1. python3 get_value_by_serial.pyで以下のような内容が出力されることを確認する。Arduino互換品(CH340のチップ)を使っているとconnected.から進まない。ドライバを別途インストールしましょう。
pi@raspberrypi:~ $ python3 get_value_by_serial.py 
connected.
24.25,18.30,3.67
24.27,18.31,3.67
24.25,18.31,3.67
  1. sudo pip3 install git+https://github.com/AmbientDataInc/ambient-python-lib.gitでAmbientをインストールする

  2. pip3 freeze | grep ambientambient==0.1.0と表示されることを確かめる

  3. Ambientの値を作ってチャンネルIDとwrite keyを取得する(いろいろ端折ってる)

  4. vi upload_arduino_data_to_ambient.pyで以下の内容を書く

import time
import serial
import ambient

def main():
    am = ambient.Ambient(channel_id, "your_write_key")
    con=serial.Serial('/dev/tty****', 9600)
    print('connected.')
    while 1:
        str=con.readline() # byte code
        list=(str.strip().decode('utf-8')).split(',')
        temp = list[0]
        humi = list[1]
        #print(temp,humi)
        r = am.send({"d1": temp, "d2": humi})
        #print('sent.')
        time.sleep(10)

if __name__ == '__main__':
    main()
  1. sudo vi /lib/systemd/system/ambientiot.service でServiceファイルを作成する
[Unit]
Description = AmbientIoT

[Service]
ExecStart=/usr/bin/python3 /home/pi/upload_arduino_data_to_ambient.py
Restart=always
Type=simple
User=pi

[Install]
WantedBy=multi-user.target
  1. sudo systemctl start ambientiot.service でサービスが正常に動くことを確認し、sudo systemctl stop ambientiot.serviceでサービスを停止する
  2. sudo systemctl enable ambientiot.service で起動時にスクリプトが自動で読み込まれるようになる

Discussion