{"id":875,"date":"2014-12-04T04:23:37","date_gmt":"2014-12-04T04:23:37","guid":{"rendered":"http:\/\/dronesonen.hibu.no\/?p=875"},"modified":"2014-12-04T04:23:54","modified_gmt":"2014-12-04T04:23:54","slug":"robothund-siste-oppdatering-04-12-2014","status":"publish","type":"post","link":"https:\/\/dronesonen.usn.no\/?p=875","title":{"rendered":"Robothund &#8211; Siste Oppdatering (04.12.2014)"},"content":{"rendered":"<p><strong>Hei!<\/strong><\/p>\n<p>Da er vi ferdig med presentasjonen av v\u00e5rt prosjekt. Vi hadde enkelte problemer med routeren i starten av fremf\u00f8ringen, men utenom det, f\u00f8ler gruppen at presentasjonen ble vel gjennomf\u00f8rt. Video, Power Point og demonstrasjon fungerte tilslutt bra sammen! \ud83d\ude42<\/p>\n<p>Under har vi vedlagt koden vi bruker til \u00e5 kontrollere roboten. Litt videre nedover har vi ogs\u00e5 vedlagt b\u00e5de koden\/skriptet vi bruker for \u00e5 starte Gstreamer pipelinen og mottakeren fra Windows.<\/p>\n<p><strong><span style=\"text-decoration: underline\">KODEN TIL KONTROLLERING:<\/span><\/strong><code><\/code><\/p>\n<p>import curses, time #curses library is used to get realtime keypress and time for sleep function<br \/>\nimport RPi.GPIO as GPIO<br \/>\nfrom time import sleep<\/p>\n<p>GPIO.setmode (GPIO.BOARD)<\/p>\n<p>#Motor 1 Venstre drivhjul<br \/>\n#Motor 2 H\u00f8yre drivhjul<br \/>\n#Motor 3 Fremre heve\/senke<br \/>\n#Motor 4 Bakre heve\/senke<\/p>\n<p>Motor1A = 5<br \/>\nMotor1B = 7<\/p>\n<p>Motor2A = 8<br \/>\nMotor2B = 10<\/p>\n<p>Motor3A = 11<br \/>\nMotor3B = 13<\/p>\n<p>Motor4A = 16<br \/>\nMotor4B = 18<\/p>\n<p>#Definere GPIO pinner som output<\/p>\n<p>GPIO.setup(Motor1A, GPIO.OUT)<br \/>\nGPIO.setup(Motor1B, GPIO.OUT)<br \/>\nGPIO.setup(3, GPIO.OUT)<\/p>\n<p>GPIO.setup(Motor2A, GPIO.OUT)<br \/>\nGPIO.setup(Motor2B, GPIO.OUT)<br \/>\nGPIO.setup(12, GPIO.OUT)<\/p>\n<p>GPIO.setup(Motor3A, GPIO.OUT)<br \/>\nGPIO.setup(Motor3B, GPIO.OUT)<br \/>\nGPIO.setup(15, GPIO.OUT)<\/p>\n<p>GPIO.setup(Motor4A, GPIO.OUT)<br \/>\nGPIO.setup(Motor4B, GPIO.OUT)<br \/>\nGPIO.setup(22, GPIO.OUT)<\/p>\n<p>#Sette PWM p\u00e5 enable pinner og frekvens<\/p>\n<p>Motor1E = GPIO.PWM(3, 100)<br \/>\nMotor2E = GPIO.PWM(12, 100)<br \/>\nMotor3E = GPIO.PWM(15, 50)<br \/>\nMotor4E = GPIO.PWM(22, 50)<\/p>\n<p>#Definere duty cycle<\/p>\n<p>fart1 = 20 #Frem\/bak<br \/>\nfart2 = 30 #Svinge<br \/>\nfart3 = 40 #Heve\/senke<\/p>\n<p>Motor1E.start(fart1)<br \/>\nMotor2E.start(fart1)<br \/>\nMotor3E.start(fart3)<br \/>\nMotor4E.start(fart3)<\/p>\n<p>stdscr = curses.initscr() #initialize the curses object<br \/>\ncurses.cbreak() #to get special key characters<br \/>\nstdscr.keypad(1) #for getting values such as KEY_UP<\/p>\n<p>key = &#8221;<br \/>\nwhile key != ord(&#8216;q&#8217;): #press &#8216;q&#8217; to quit from program<br \/>\nkey = stdscr.getch() #get a character from terminal<\/p>\n<p>stdscr.refresh()<\/p>\n<p>#change the motor speed based on key value<\/p>\n<p>if key == curses.KEY_UP : #Kjoere Frem<br \/>\nMotor1E.ChangeDutyCycle(fart1)<br \/>\nGPIO.output(Motor1A, GPIO.LOW)<br \/>\nGPIO.output(Motor1B, GPIO.HIGH)<\/p>\n<p>Motor2E.ChangeDutyCycle(fart1)<br \/>\nGPIO.output(Motor2A, GPIO.LOW)<br \/>\nGPIO.output(Motor2B, GPIO.HIGH)<\/p>\n<p>elif key == curses.KEY_DOWN : #Kjoere bakover<br \/>\nMotor1E.ChangeDutyCycle(fart1)<br \/>\nGPIO.output(Motor1A, GPIO.HIGH)<br \/>\nGPIO.output(Motor1B, GPIO.LOW)<\/p>\n<p>Motor2E.ChangeDutyCycle(fart1)<br \/>\nGPIO.output(Motor2A, GPIO.HIGH)<br \/>\nGPIO.output(Motor2B, GPIO.LOW)<\/p>\n<p>elif key == curses.KEY_LEFT : #Svinge venstre<br \/>\nMotor1E.ChangeDutyCycle(fart2)<br \/>\nGPIO.output(Motor1A, GPIO.HIGH)<br \/>\nGPIO.output(Motor1B, GPIO.LOW)<\/p>\n<p>Motor2E.ChangeDutyCycle(fart2)<br \/>\nGPIO.output(Motor2A, GPIO.LOW)<br \/>\nGPIO.output(Motor2B, GPIO.HIGH)<\/p>\n<p>elif key == curses.KEY_RIGHT : #Svinge hoeyre<br \/>\nMotor1E.ChangeDutyCycle(fart2)<br \/>\nGPIO.output(Motor1A, GPIO.LOW)<br \/>\nGPIO.output(Motor1B, GPIO.HIGH)<\/p>\n<p>Motor2E.ChangeDutyCycle(fart2)<br \/>\nGPIO.output(Motor2A, GPIO.HIGH)<br \/>\nGPIO.output(Motor2B, GPIO.LOW)<\/p>\n<p>elif key == ord(&#8216;e&#8217;): #Forhjul opp<br \/>\nMotor3E.ChangeDutyCycle(fart3)<br \/>\nGPIO.output(Motor3A, GPIO.LOW)<br \/>\nGPIO.output(Motor3B, GPIO.HIGH)<\/p>\n<p>elif key == ord(&#8216;d&#8217;): #Forhjul ned<br \/>\nMotor3E.ChangeDutyCycle(fart3)<br \/>\nGPIO.output(Motor3A, GPIO.HIGH)<br \/>\nGPIO.output(Motor3B, GPIO.LOW)<\/p>\n<p>elif key == ord(&#8216;r&#8217;): #Bakhjul opp<br \/>\nMotor4E.ChangeDutyCycle(fart3)<br \/>\nGPIO.output(Motor4A, GPIO.HIGH)<br \/>\nGPIO.output(Motor4B, GPIO.LOW)<\/p>\n<p>elif key == ord(&#8216;f&#8217;): #Bakhjul ned<br \/>\nMotor4E.ChangeDutyCycle(fart3)<br \/>\nGPIO.output(Motor4A, GPIO.LOW)<br \/>\nGPIO.output(Motor4B, GPIO.HIGH)<\/p>\n<p>sleep(0.040) #pause for 40 ms<\/p>\n<p>GPIO.output(Motor1A, GPIO.LOW)<br \/>\nGPIO.output(Motor1B, GPIO.LOW)<\/p>\n<p>GPIO.output(Motor2A, GPIO.LOW)<br \/>\nGPIO.output(Motor2B, GPIO.LOW)<\/p>\n<p>GPIO.output(Motor3A, GPIO.LOW)<br \/>\nGPIO.output(Motor3B, GPIO.LOW)<\/p>\n<p>GPIO.output(Motor4A, GPIO.LOW)<br \/>\nGPIO.output(Motor4B, GPIO.LOW)<\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"text-decoration: underline\"><strong>Koden til Gstreamer skriptet p\u00e5 Raspberry Pi&#8217;en (Pipeline sender):<\/strong><\/span><br \/>\n<code><br \/>\n#!\/bin\/bash<br \/>\nclear<br \/>\nraspivid -n -t 0 -w 500 -h 500 -fps 30 -b 600000 -o - | gst-launch-1.0 -e -vvvv fdsrc ! h264parse ! rtph264pay pt=96 config-interval=5 ! udpsink host=192.168.1.2 port=5000<br \/>\n<\/code><\/p>\n<p><span style=\"text-decoration: underline\"><strong>Koden til Gstreamer skripet p\u00e5 Windows (Pipeline mottaker):<\/strong><\/span><br \/>\n<code><br \/>\n@echo off<br \/>\ncd C:\\gstreamer\\1.0\\x86_64\\bin<br \/>\ngst-launch-1.0 -e -v udpsrc port=5000 ! application\/x-rtp, payload=96 ! rtpjitterbuffer ! rtph264depay ! avdec_h264 ! fpsdisplaysink sync=false text-overlay=false<br \/>\n<\/code><\/p>\n<p>Takk til alle som har fulgt med p\u00e5 bloggen! \ud83d\ude42<br \/>\nTakk for oss! \ud83d\ude00<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hei! Da er vi ferdig med presentasjonen av v\u00e5rt prosjekt. Vi hadde enkelte problemer med routeren i starten av fremf\u00f8ringen, men utenom det, f\u00f8ler gruppen at presentasjonen ble vel gjennomf\u00f8rt. Video, Power Point og demonstrasjon fungerte tilslutt bra sammen! \ud83d\ude42 Under har vi vedlagt koden vi bruker til \u00e5 kontrollere roboten. Litt videre nedover har [&hellip;]<\/p>\n","protected":false},"author":30,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17],"tags":[],"class_list":["post-875","post","type-post","status-publish","format-standard","hentry","category-smart-systems-2014-robothund"],"_links":{"self":[{"href":"https:\/\/dronesonen.usn.no\/index.php?rest_route=\/wp\/v2\/posts\/875","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dronesonen.usn.no\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dronesonen.usn.no\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dronesonen.usn.no\/index.php?rest_route=\/wp\/v2\/users\/30"}],"replies":[{"embeddable":true,"href":"https:\/\/dronesonen.usn.no\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=875"}],"version-history":[{"count":1,"href":"https:\/\/dronesonen.usn.no\/index.php?rest_route=\/wp\/v2\/posts\/875\/revisions"}],"predecessor-version":[{"id":876,"href":"https:\/\/dronesonen.usn.no\/index.php?rest_route=\/wp\/v2\/posts\/875\/revisions\/876"}],"wp:attachment":[{"href":"https:\/\/dronesonen.usn.no\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=875"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dronesonen.usn.no\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=875"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dronesonen.usn.no\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=875"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}