#!/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()
#!/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()
株式会社アムイ 代表取締役
山田 浩貢(やまだ ひろつぐ)
NTTデータ東海にて1990年代前半より製造業における生産管理パッケージシステムの企画開発・ユーザー適用および大手自動車部品メーカーを中心とした生産系業務改革、
原価企画・原価管理システム構築のプロジェクトマネージメントに従事。2013年に株式会社アムイを設立し大手から中堅中小製造業の業務改革、業務改善に伴うIT推進コンサルティングを手掛けている。「現場目線でのものづくり強化と経営効率向上にITを生かす」活動を展開中。
ラズパイでAGVを制御する(その1)
ラズパイでRFIDを活用したトレーサビリティーシステムを構築する(その2)
ラズパイでRFIDを活用したトレーサビリティーシステムを構築する(その1)
ラズパイとAI-OCRで生産日報を電子化する(後編)
ラズパイとAI-OCRで生産日報を電子化する(前編)
ラズパイとカメラと100均の組み合わせで機械工具の在庫を可視化するCopyright © ITmedia, Inc. All Rights Reserved.
製造マネジメントの記事ランキング
コーナーリンク