「札幌で開催!IoT縛りの勉強・発表会! Vol.05」で発表した資料。
-&(0#0045Ͱ େਓ༡΅͏ʂʙϥζύΠΧϝϥ࿈ܞฤʙ
View Slide
ࣗݾհීஈΤϯλʔϓϥΠζܥͷιϑτΣΞΤϯδχΞಀආ׆ಈͱͯ͠ϚΠίϯϘʔυܥ&5ϩϘίϯւಓ۠ɹ࣮ߦҕһ1ZUIPOࡳຈཪํ
˞݄ݱࡏ
̏छྨͷ#0045ϒϩοΫϜʔϒϋϒ֎෦ϞʔλʔΧϥʔˍڑηϯαʔଂϞʔλʔYଂνϧτηϯαʔ3(#-&%
BLEίϚϯυ௨ϓϩάϥϜ͕ಈ͘ͷΞϓϦ্
https://github.com/JorgePe/BOOSTreveng#-&ͷ௨৴༰େํղੳ͞Ε͍ͯΔ
https://github.com/JorgePe/pyb00st1ZUIPOͷ"1*͋Δ QZCTU˞ଞʹOPEFKT +BWB4DSJQUͷ"1*͋Δ
https://qiita.com/sonoisa/items/cf0bc6c0ed4d244407b4εϚʔτϩοΫ࣮ݱͨ͠ڧऀ͍Δ
ΧϝϥϞδϡʔϧ3BTQCFSSZ1J;FSP8ʢը૾ॲཧɺߦಈఆʣ#-&ʢಈ࡞ࢦࣔʣࠓճͬͯΈͨ͜ͱ※εΠοναΠΤϯεͰͷՁ֨ʢ20191݄19ݱࡏʣɹRaspberry Pi Zero W 1,296ԁ ɹRaspberry Pi ΧϝϥϞδϡʔϧ V2 4,680ԁɹRaspberry Pi Zero έʔε 648ԁ͍ΘΏΔʮϚγϯϏδϣϯʯͷ·Ͷ͝ͱ https://ja.wikipedia.org/wiki/ϚγϯϏδϣϯ
ϥζύΠΧϝϥ͔Βͷը૾࿈ଓऔΓࠐΈimport picameraimport picamera.arrayimport cv2import time:with picamera.PiCamera() as camera:camera.resolution = (160, 120) # 160x120ͷղ૾time.sleep(2)with picamera.array.PiRGBArray(camera) as frame:time.sleep(0.1)for frame in camera.capture_continuous(frame, 'bgr',use_video_port=True):image = frame.array# ͜͜Ͱ֤ϑϨʔϜͷΠϝʔδΛॲཧʢOpenCV 2Λར༻ʣ
roi = image[60:120, 0:160] # ؔ৺ྖҬͷΓग़͠ݩͷΠϝʔδ(image)
mono = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY) # ϞϊΫϩԽblur = cv2.GaussianBlur(mono, (9, 9), 0) # ฏԽ
ret,thresh = cv2.threshold(blur, 60, 255,cv2.THRESH_BINARY_INV|cv2.THRESH_OTSU) # ೋԽerode_img = cv2.erode(thresh, None, iterations=2) # ऩॖ(Erosion)dilate_img = cv2.dilate(erode_img, None, iterations=2) # ு(Dilation)
_,contours,hierarchy = cv2.findContours(dilate_img, 1, cv2.CHAIN_APPROX_NONE)# ྠֲݕग़c = max(contours, key=cv2.contourArea) # ໘ੵ͕࠷େͷྠֲM = cv2.moments(c) # Ϟʔϝϯτʢॏ৺ʣcx = int(M[‘m10’]/M['m00']) # ॏ৺࠲ඪ xcy = int(M[‘m01']/M['m00']) # ॏ৺࠲ඪ y
mymovehub = MoveHub(MY_MOVEHUB_ADD, 'BlueZ', MY_BTCTRLR_HCI):if cx >= 120: # ӈટճ(duty_a, duty_b) = (100, 10)elif cx > 50: # ਐ(duty_a, duty_b) = (100, 100)elif cx > 0: # ࠨટճ(duty_a, duty_b) = (10, 100)else: # ఀࢭ(duty_a, duty_b) = (0, 0)mymovehub.run_motors_for_time(MOTOR_AB, 150, duty_a, duty_b)
·ͱΊ-&(0#0045ͷ௨৴΄΅ղੳࡁΈͰେਓ༡Δ#-&͕͑ΕͲΜͳػث͔ΒͰ#-&Χϝϥ͕͑ΔػثͱͳΒϚγϯϏδϣϯͰ͖Δ%FFQ3BDFSͷϚω͝ͱ͍ͨ͠