Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

Raspberry Pi ZeroでIoTプラレールを作ってみよう~PythonとAzureでWebアプリから制御する

Raspberry Pi Zeroではじめよう! おうちで楽しむIoTレシピ 第10回

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2019/01/09 11:00

 この連載では、約650円で買えるマイコンボードRaspberry Pi Zeroを使って、ITエンジニアがIoTを学べたり、家族で楽しんだりできるIoTレシピをご紹介していきます。最終回となる今回は、Raspberry Pi Zero Wをプラレールの貨車に搭載し、Webアプリで「IoTプラレール」を制御する方法をご紹介します。

目次

 用意するものや基板の実装方法は、前回記事で紹介しています。

IoTプラレールをPythonのコードで動かす~テスト走行

 前回記事では、プラレールと貨車を改造して準備する所まで紹介しました。今回はPythonのプログラムでプラレールを動作させてみます。まずはテスト走行です。

事前セットアップ

 テスト走行を始める前に、Raspberry Pi Raspbian Stretchのパッケージアップデートを実行し、再起動を行います。

$ sudo apt update
$ sudo apt upgrade
$ sudo reboot

 Raspberry PiをMQTT Subscriberとして動作させるため、以下の必要パッケージをインストールします。

$ sudo apt install python-rpi.gpio
$ pip install paho-mqtt

 GitコマンドでIoTプラレール用のSubscriberを展開します。次の手順で紹介するサンプルコード motor_on_off.pyも以下のリポジトリに格納されています。

$ git clone https://github.com/manami-taira/iot-plarail-subscriber.git

モーター制御

 まず、モーターを制御するにあたり、Pythonのサンプルコードをご紹介します。動作確認用のサンプルコードのmotor_on_off.pyについて説明します。

サンプルコード: motor_on_off.py
#-*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time

IN_A = 20 #GPIO:20
IN_B = 21 #GPIO:21

def gpio_init():
	GPIO.setmode(GPIO.BCM)
	return

def gpio_cleanup():
	GPIO.cleanup()
	return

def motor_init():
	gpio_init()
	GPIO.setup(IN_A,GPIO.OUT)
	GPIO.setup(IN_B,GPIO.OUT)
	motor_stop()
	return

def motor_forward():
	GPIO.output(IN_A,GPIO.HIGH)
	GPIO.output(IN_B,GPIO.LOW)
	return

def motor_stop():
	GPIO.output(IN_A,GPIO.LOW)
	GPIO.output(IN_B,GPIO.LOW)
	return

def main():
	motor_init()
	motor_forward()
	time.sleep(2.0)
	motor_stop()
	gpio_cleanup()
	return

if __name__ == "__main__":
	main()

 少し行数が多いですが、main()関数の部分からたどって解説していきます。

def main():
	motor_init()
	motor_forward()
	time.sleep(2.0)
	motor_stop()
	gpio_cleanup()
	return

 まず、GPIO.setmode(GPIO.BCM)を指定することでRaspberry Piの40ピンの表記名と同じモードで初期化します。gpio_init()はmotor_init()の中から呼ばれています。

def gpio_init():
	GPIO.setmode(GPIO.BCM)
	return

 GPIO:20とGPIO:21をOUTPUTモードに指定します。

def motor_init():
	gpio_init()
	GPIO.setup(IN_A,GPIO.OUT)
	GPIO.setup(IN_B,GPIO.OUT)
	motor_stop()
	return

 そして、GPIO:20をLOW、GPIO:21をLOWにセットして初期化します。

def motor_stop():
	GPIO.output(IN_A,GPIO.LOW)
	GPIO.output(IN_B,GPIO.LOW)
	return

 次にGPIO:20 をHIGH、GPIO:21をLOWにセットします。次のtime.sleep() 関数で走行させたい秒数を指定します。

def motor_forward():
	GPIO.output(IN_A,GPIO.HIGH)
	GPIO.output(IN_B,GPIO.LOW)
	return

 最後に車両を停止させるために、GPIO:20 をLOW、GPIO:21をLOWにセットします。

def motor_stop():
	GPIO.output(IN_A,GPIO.LOW)
	GPIO.output(IN_B,GPIO.LOW)
	return

 動作確認時はレールに載せずに駆動車両をペットボトル飲料のキャップに乗せて浮かせるか、横に90°倒した状態で確認すると良いでしょう。レールの上で行うとHDMIケーブルやシリアルケーブルがつながった状態で発進してしまい大変なことになります。

 上記で紹介したサンプルプログラムでは外部から操作できません。Wi-Fi経由でRaspberry Pi Zero WにSSHでログインしてから、Pythonのコードを実行すると動作確認しやすいです。

 次のようにPythonコマンドで実行すると駆動車両のモーターが2秒間動いて静止します。

# python ./motor_on_off.py

 ただ、コマンドラインから操作するだけでは子どもに遊ばせるには難しいでしょう。そこで次に、MQTTプロトコルを使ってWebブラウザーから操作する「IoTマスコン」を作る方法をご紹介します。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 平 愛美(タイラ マナミ)

     熊本県出身のITエンジニア。2児の母で、趣味は写真とグルメ。最近はRaspberry Pi、Arduinoを使った家庭内IoTについて日々研究するIT系母ちゃんとして活躍中。主な著書は、『改訂3版 Linuxエンジニア養成読本』(寄稿、技術評論社 刊)、『Linuxシステム管理標準教科書』(共著、...

バックナンバー

連載:Raspberry Pi Zeroではじめよう! おうちで楽しむIoTレシピ

もっと読む

All contents copyright © 2005-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5