👋
買ったばかりのRaspberry PiからAmbientにデータを送る
*パソコンは mac を想定
- microSDカードを挿したカードリーダーを mac に挿す
- Raspberry Pi ImagerでOSを書き込む(20分ほどかかる)
- 一度 micro SD カードを抜き差しする
-
/Volumes/boot
としてマウントされる - 以下のコマンドで ssh, WiFi 用の設定ファイルを用意する
$ cd /Volumes/boot
$ touch ssh
$ vi wpa_supplicant.conf
- 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
}
- microSDカードを抜く
- ラズパイにmicroSDカードを挿して給電する
- コマンドプロンプトまたはターミナルで
ping raspberrypi.local
、ネットワークに接続されていることを確認する。無線接続に失敗する場合、LANケーブルを挿して再度接続を確認する - 2,3分待って mac から
ssh pi@raspberrypi.local
。パスワードはraspberry -
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
と表示される時はvi ~/.ssh/known_hosts
でraspberrypi.localの行を削除して保存する - sshの接続が完了する
-
sudo apt-get update
でパッケージマネージャを更新する -
sudo apt-get -y install python3-pip python3 git python-pip
をインストールする -
sudo pip3 install pyserial
でPythonのserialライブラリをインストールする。カレントディレクトリにserial.pyなどのファイルがあるとpyserialの呼び出しに失敗するので注意する - ラズパイとArduinoをUSBケーブルで接続する
- Arduinoに〜〜〜のファームウェアを書き込む
-
ls /dev/tty*
でArduinoとの接続に使用しているポートを調べる。ttyAMA0、ttyACM0 などの値があればビンゴ -
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()
-
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
-
sudo pip3 install git+https://github.com/AmbientDataInc/ambient-python-lib.git
でAmbientをインストールする -
pip3 freeze | grep ambient
でambient==0.1.0
と表示されることを確かめる -
Ambientの値を作ってチャンネルIDとwrite keyを取得する(いろいろ端折ってる)
-
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()
-
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
-
sudo systemctl start ambientiot.service
でサービスが正常に動くことを確認し、sudo systemctl stop ambientiot.service
でサービスを停止する -
sudo systemctl enable ambientiot.service
で起動時にスクリプトが自動で読み込まれるようになる
Discussion