連載
ラズパイでAGVを制御する(その2)【サンプルコード付き】:ラズパイで製造業のお手軽IoT活用(9)(4/4 ページ)
小型ボードコンピュータ「Raspberry Pi(ラズパイ)」を使って、低コストかつ現場レベルでIoT(モノのインターネット)を活用する手法について解説する本連載。第9回では、前回紹介したラズパイで制御するAGVについて、その構造や制御プログラムについて説明する。サンプルコードもあるよ!
※本記事はアフィリエイトプログラムによる収益を得ています
記事に使用したサンプルコードのテキスト
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import math
import threading
import seigyo
from time import sleep
from datetime import datetime
from pathlib import Path
import sys
import concurrent.futures
import rospy
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
import cv2
from pyzbar.pyzbar import decode
import numpy as np
import RPi.GPIO as GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.cleanup()
#GPIOへピン番号でアクセスすることを宣言
GPIO.setmode(GPIO.BOARD)
#正転時のGPIOピン番号を指定
#右前輪
Right_front = 11
#左前輪
Left_front = 16
#右後輪
Right_rear = 29
#左後輪
Left_rear = 33
#後転時のGPIOピン番号を指定
#右前輪
Right_front_back = 13
#左前輪
Left_front_back = 18
#右後輪
Right_rear_back = 31
#左後輪
Left_rear_back = 35
#GPIOピン番号を配列に格納
read = [Right_front, Left_front, Right_rear, Left_rear]
back = [Right_front_back, Left_front_back, Right_rear_back, Left_rear_back]
left = [Right_front, Left_front_back, Right_rear, Left_rear_back]
right = [Right_front_back, Left_front, Right_rear_back, Left_rear]
#超音波センサのGPIOピン番号を指定
#超音波センサ出力
TRIG = 36
#超音波センサ受信
ECHO = 38
#超音波センサに出力に設定
GPIO.setup(TRIG,GPIO.OUT)
#超音波センサに受信に設定
GPIO.setup(ECHO,GPIO.IN)
#障害物との距離が30cm未満になれば停止する
flg = 0
def ult():
global flg
while True:
if flg == 0:
GPIO.setup(TRIG,GPIO.OUT)
GPIO.setup(ECHO,GPIO.IN)
#GPIOに出力
GPIO.output(TRIG, GPIO.LOW)
time.sleep(0.3)
GPIO.output(TRIG, GPIO.HIGH)
#処理を一旦停止する
time.sleep(0.00001)
#GPIO.output(TRIG, False)
GPIO.output(TRIG, GPIO.LOW)
#超音波を出して距離を測定
while GPIO.input(ECHO) == 0:
signaloff = time.time()
while GPIO.input(ECHO) == 1:
signalon = time.time()
timepassed = signalon - signaloff
#測定した距離をcmの値に変換
distance = timepassed * 17000
#測定した値を整数値に変換
measure=int(distance)
if measure < 20:
#一時停止
flg = 1
print('障害物までの距離が20cm未満になったので停止します。')
elif flg == 4:
GPIO.cleanup()
sys.exit()
#前進・後退・右左折の制御
def adv():
global flg
while True:
if flg == 0:
seigyo.go()
elif flg == 1:
seigyo.stop()
seigyo.avoid()
seigyo.stop()
flg =0
elif flg == 2:
print('左に曲がります。')
seigyo.stop()
seigyo.turn_ll()
seigyo.stop()
flg =0
elif flg == 3:
print('右に曲がります。')
seigyo.stop()
seigyo.turn_rr()
seigyo.stop()
flg =0
elif flg == 4:
print('制御を終了します。')
sys.exit()
#QR読み取りの制御
def process_image(msg):
try:
global flg
if flg == 0:
bridge = CvBridge()
orig = bridge.imgmsg_to_cv2(msg, "bgr8")
img = cv2.cvtColor(orig, cv2.COLOR_BGR2GRAY)
data = decode(img)
code = data[0][0].decode('utf-8', 'ignore')
print(code)
#左折
if code == "left":
flg = 2
#右折
elif code == "right":
flg = 3
#停止
elif code == "stop":
flg = 4
sys.exit()
except Exception as err:
pass
def start_node():
rospy.spin()
if __name__ == "__main__":
try:
rospy.init_node('img_proc')
rospy.loginfo('img_proc node started')
rospy.Subscriber("image_raw", Image, process_image)
th1 = threading.Thread(target=start_node)
th1.setDaemon(True)
th1.start()
th2 = threading.Thread(target=adv)
th2.start()
th3 = threading.Thread(target=ult)
th3.setDaemon(True)
th3.start()
#例外処理(Ctrl-C含む)
except KeyboardInterrupt:
#GPIOポート開放
print('終了')
GPIO.cleanup()
リスト1 「main.py」のサンプルコード
#!/usr/bin/env python # -*- coding: utf-8 -*- #GPIOにアクセスするライブラリをimport import RPi.GPIO as GPIO import time GPIO.setwarnings(False) #GPIOへピン番号でアクセスすることを宣言 GPIO.setmode(GPIO.BOARD) #前進処理 def go(): GPIO.setup(read, GPIO.OUT) GPIO.output(read, GPIO.HIGH) time.sleep(0.01) GPIO.output(read, GPIO.LOW) time.sleep(0.01) GPIO.cleanup(read) #後退処理 def rese(): GPIO.setup(back, GPIO.OUT) GPIO.output(back, GPIO.HIGH) time.sleep(0.01) GPIO.output(back, GPIO.LOW) time.sleep(0.01) GPIO.cleanup(back) #左折処理 def turn_left(): GPIO.setup(left, GPIO.OUT) GPIO.output(left, GPIO.HIGH) time.sleep(0.01) GPIO.output(left, GPIO.LOW) time.sleep(0.01) GPIO.cleanup(left) #右折処理 def turn_right(): GPIO.setup(right, GPIO.OUT) GPIO.output(right, GPIO.HIGH) time.sleep(0.01) GPIO.output(right, GPIO.LOW) time.sleep(0.01) GPIO.cleanup(right) #停止確認処理 def stop(): time.sleep(1.0) #回転の制御 #strは直進する時間 str = 100 #ttimeは回転する時間 ttime = 60 #shortは回転した後に進む時間 short = 60 #hidは後退する時間 hid = 15 def turn_r(): for i in range(ttime): turn_right() stop() for i in range(short): go() stop() def turn_rr(): for i in range(ttime): turn_right() def turn_ll(): for i in range(ttime): turn_left() stop() for i in range(str): go() stop() def turn_l(): for i in range(ttime): turn_left() stop() for i in range(short): go() stop() def leave(): for i in range(hid): rese() stop() def adv(): while True: go() def avoid(): stop() leave() turn_r() turn_ll() turn_l() turn_rr()
リスト2 「seigyo.py」のサンプルコード
本連載執筆の山田浩貢氏のIoT関連書籍が好評発売中です!
筆者紹介
株式会社アムイ 代表取締役
山田 浩貢(やまだ ひろつぐ)
NTTデータ東海にて1990年代前半より製造業における生産管理パッケージシステムの企画開発・ユーザー適用および大手自動車部品メーカーを中心とした生産系業務改革、
原価企画・原価管理システム構築のプロジェクトマネージメントに従事。2013年に株式会社アムイを設立し大手から中堅中小製造業の業務改革、業務改善に伴うIT推進コンサルティングを手掛けている。「現場目線でのものづくり強化と経営効率向上にITを生かす」活動を展開中。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- ≫連載「ラズパイで製造業のお手軽IoT活用」バックナンバー
- ≫連載「品質保証の本質とIoTの融合」バックナンバー
- ≫連載「いまさら聞けないISO22400入門」バックナンバー
- ≫連載「鈴村道場」バックナンバー
- ≫連載「トヨタ生産方式で考えるIoT活用【実践編】」バックナンバー
- ≫連載「トヨタ生産方式で考えるIoT活用」バックナンバー
ラズパイでAGVを制御する(その1)
小型ボードコンピュータ「Raspberry Pi(ラズパイ)」を使って、低コストかつ現場レベルでIoT(モノのインターネット)を活用する手法について解説する本連載。第8回では、工場などで用いられるAGVの制御にラズパイを活用する目的について解説する。
ラズパイでRFIDを活用したトレーサビリティーシステムを構築する(その2)
小型ボードコンピュータ「Raspberry Pi(ラズパイ)」を使って、低コストかつ現場レベルでIoT(モノのインターネット)を活用する手法について解説する本連載。第7回は、第6回で紹介したラズパイとRFIDを活用したトレーサビリティーシステムをどのように構築すればいいのかについて、より具体的に解説します。
ラズパイでRFIDを活用したトレーサビリティーシステムを構築する(その1)
小型ボードコンピュータ「Raspberry Pi(ラズパイ)」を使って、低コストかつ現場レベルでIoT(モノのインターネット)を活用する手法について解説する本連載。第6回は、ラズパイとRFIDを活用したトレーサビリティーシステム構築のコンセプトについて解説します。
ラズパイとAI-OCRで生産日報を電子化する(後編)
小型ボードコンピュータ「Raspberry Pi(ラズパイ)」を使って、低コストかつ現場レベルでIoT(モノのインターネット)を活用する手法について解説する本連載。第5回は、前回に引き続き、AI技術の活用事例として注目を集めるAI-OCRとラズパイの組み合わせによる生産日報の電子化について具体的に解説します。
ラズパイとAI-OCRで生産日報を電子化する(前編)
小型ボードコンピュータ「Raspberry Pi(ラズパイ)」を使って、低コストかつ現場レベルでIoT(モノのインターネット)を活用する手法について解説する本連載。第4回と第5回では、AI技術の活用事例として注目を集めるAI-OCRとラズパイの組み合わせによる生産日報の電子化について前後編に分けて解説します。
ラズパイとカメラと100均の組み合わせで機械工具の在庫を可視化する
小型ボードコンピュータ「Raspberry Pi(ラズパイ)」を使って、低コストかつ現場レベルでIoTを活用する手法について解説する本連載。第3回は、カメラを組み合わせた画像解析の事例として、機械工具の在庫の2Sと在庫可視化をどのように実現するかについて具体的に解説します。