{"id":1410,"date":"2013-01-29T11:42:48","date_gmt":"2013-01-29T09:42:48","guid":{"rendered":"http:\/\/blog.cipworx.org\/laserman\/?p=1410"},"modified":"2013-01-30T19:07:16","modified_gmt":"2013-01-30T17:07:16","slug":"bluetooth-auto","status":"publish","type":"post","link":"https:\/\/blog.cipworx.org\/laserman\/2013\/01\/29\/bluetooth-auto\/","title":{"rendered":"Bluetooth-Auto"},"content":{"rendered":"<p>Bastelprojekte, bei denen man keine Teile bestellen muss, weil man alles schon zu hause herumliegen hat, mag ich besonders. Das Bluetooth-Auto in den letzten 3 Tagen war so ein Projekt. Ein Freund gab mit ein &#8220;MGA CLUTCH AXI TRESPASS Land &#038; Sea Fluid 4WD RC&#8221; Spielzeug-Auto f\u00fcr das er keine Fernsteuerung und auch keine funktionierenden Akkus mehr besa??. Zun\u00e4chst habe ich \u00fcberlegt, ob man normale RC-Empf\u00e4nger und Motorregler einbauen kann, aber ich hatte nur einen Regler f\u00fcr B\u00fcrstenmotoren &#8211; ohne R\u00fcckw\u00e4rtsgang.<br \/>\nDas Auto zu \u00f6ffnen war nicht einfach: Viele schwer erreichbare Schrauben, viel Fett und Dichtungsgummis, denn das Auto konnte auch auf Wasser fahren.<br \/>\nAuf der Platine fand ich 6 Relais: 2 x Motor links , 2 x Motor rechts, 2 x Motor Lenkung &#8211; dachte ich &#8211; aber die Lenkung hatte eine Eigene Transistor-H-Br\u00fccke. Also 3 Relais pro Motor f\u00fcr Umpolung und 2 Geschwindigkeitsstufen.<\/p>\n<p><strong>Hardware-Hack<\/strong><\/p>\n<p>Die Relais hatten SMD Treiber Transistoren mit Testpunkten am Eingang &#8211; Dort h\u00e4tte ich die Ausg\u00e4nge meines Atmega8 mit positiver Logik anschlie??en k\u00f6nnen. aber ich hatte aus dem RGB-Heli-Projekt noch die Platine mit Spannungsregler, ULN2803 und Anschl\u00fcssen f\u00fcr Seriell und ISP. Also bin ich mit den Ausg\u00e4ngen des ULN direkt an die Relais gegangen. An TX &#038; RX habe ich ein $10 Bluetooth RF Transceiver Module angeschlossen, wie es sich schon beim Multiwii quadcopter bew\u00e4hrt hat.<br \/>\n<strong><br \/>\nSoftware-Hack, Arduino<br \/>\n<\/strong><\/p>\n<pre><code>\r\nint inByte = 0;         \/\/ incoming serial byte\r\nconst int red1 = 6;\r\nconst int green1 = 3;\r\nconst int blue1 = 5;\r\nconst  int red2 = 9;\r\nconst  int green2 = 11;\r\nconst  int blue2 = 10;\r\n\r\nbyte state = 0;\r\nunsigned long currentMillis ;\r\nunsigned long commandMillis;\r\nlong interval = 1000;           \r\nconst byte o_stop =   0;\r\n\r\nvoid alloff() {\r\n  digitalWrite(blue1, LOW);\r\n  digitalWrite(blue2, LOW);\r\n  digitalWrite(red1, LOW);\r\n  digitalWrite(red2, LOW);\r\n  digitalWrite(green1, LOW);\r\n  digitalWrite(green2, LOW);\r\n  delay(200);\r\n}\r\n\r\nvoid allon() {\r\n  digitalWrite(blue1, HIGH);\r\n  digitalWrite(blue2,HIGH );\r\n  digitalWrite(red1, HIGH);\r\n  digitalWrite(red2, HIGH);\r\n  digitalWrite(green1, HIGH);\r\n  digitalWrite(green2,HIGH );\r\n  delay(200);\r\n  \r\n}\r\n\r\nvoid setup() {\r\n  \r\n  pinMode(red1, OUTPUT);\r\n  pinMode(green1, OUTPUT);\r\n  pinMode(blue1, OUTPUT);\r\n  pinMode(red2, OUTPUT);\r\n  pinMode(green2, OUTPUT);\r\n  pinMode(blue2, OUTPUT);\r\n  currentMillis = millis();\r\n  commandMillis = currentMillis;\r\n  Serial.begin(115200);\r\n  \r\n  allon();\r\n  alloff();\r\n  allon();\r\n  alloff();\r\n}\r\n\r\nvoid loop() {\r\n  if (Serial.available() > 0) {\r\n    inByte = Serial.read();\r\n    Serial.write(inByte);\r\n    state = inByte;\r\n    Serial.write(state);\r\n    digitalWrite(green2, (state & B00100000)   );\r\n    digitalWrite(blue2,  (state & B00010000)   );\r\n    digitalWrite(red2,   (state & B00001000)   );\r\n    digitalWrite(green1, (state & B00000100)   );\r\n    digitalWrite(blue1,  (state & B00000010)   );\r\n    digitalWrite(red1,   (state & B00000001)   );\r\n    commandMillis = millis();\r\n  }\r\n  currentMillis = millis();\r\n  if(currentMillis - commandMillis > interval) {\r\n     alloff();\r\n     state = o_stop;\r\n  }\r\n}\r\n<\/code><\/pre>\n<p><strong>Software-Hack, android<\/strong><\/p>\n<p>Von der Android-App, die ich mit SL4A in python geschrieben habe, gibt es 3 Varianten:<br \/>\n<strong>1.Variante<\/strong><br \/>\n In einem Dialog mit den Buttons &#8220;+&#8221; &#8220;-&#8221; und &#8220;send&#8221; kann man ASCI Zeichen ab &#8220;0&#8221; durchbl\u00e4ttern und zum Auto senden. Dabei habe ich mir notiert, bei welchen Zeichen (=Relaiskobinationen) was passiert &#8211; F\u00fcr das Auto sind nur die unteren 6 Bits relevant.<\/p>\n<pre>\r\nXXXX X011 \"3\" rechter Motor r\u00fcckw\u00e4rts \r\nXXXX X101 \"5\" rechter Motor vorw\u00e4rts\r\n???? ???? \"@\" stop\r\n0101 1000 \"X\" linker Motor r\u00fcckw\u00e4rts\r\n???? ???? \"[\" beide Motoren r\u00fcckw\u00e4rts\r\n???? ???? \"]\" beide Motoren, Auto dreht auf der Stelle linksherum\r\n0110 1000 \"h\" linker Motor vorw\u00e4rts\r\n0110 1011 \"k\" beide Motoren, Auto dreht auf der Stelle rechtsherum\r\n0110 1101 \"m\" beide Motoren vorw\u00e4rts\r\n<\/pre>\n<p><strong>2.Variante<\/strong><br \/>\nhier kann man Zeichen per soft-keybord ausw\u00e4hlen und senden um die Ergebnisse aus 1 nuch mal zu kontrollieren.<\/p>\n<p><strong>3.Variante<\/strong><br \/>\nJe nach Neigung des Handys wird eins von 5 Zeichen zum Auto gesendet, 4 x pro Sekunde. siehe Video<\/p>\n<pre><code>\r\n#!\/usr\/bin\/python\r\n# -*- coding: utf-8 -*-\r\n\r\nimport android\r\nimport time\r\n\r\ntilt_angle = 0.2\r\n\r\nb_forw = 'm'\r\nb_backw ='['\r\nb_turn_right ='k'\r\nb_turn_left = ']'\r\nb_stop = '@'\r\noutb = '@'\r\n\r\ndef bt_out(value):\r\n   droid.bluetoothWrite(value)\r\n \r\nif __name__ == '__main__':\r\n    # global android Object for GUI\r\n    droid = android.Android()\r\n    \r\n    # every 200ms\r\n    ret = droid.startSensingTimed(1,200)\r\n    droid.bluetoothConnect('00001101-0000-1000-8000-00805F9B34FB', '00:12:02:11:01:10')\r\n    time.sleep(1)\r\n    state = b_stop\r\n    \r\n    while True:\r\n        ret = droid.sensorsReadOrientation().result\r\n        pitch = ret[1]\r\n        roll  = ret[2]\r\n        #print pitch,roll,\r\n        if pitch < -1.4:\r\n            droid.stopSensing() \r\n            droid.bluetoothStop()\r\n            exit()\r\n        if pitch > tilt_angle:\r\n            print 'forwards',\r\n            state = b_forw\r\n        if pitch < -tilt_angle:\r\n            print 'backwards',\r\n            state = b_backw\r\n        if pitch > -tilt_angle and pitch < tilt_angle:\r\n            print '-----',\r\n            state = b_stop\r\n        if roll > tilt_angle:\r\n            print 'right',\r\n            state = b_turn_right\r\n        if roll < -tilt_angle:\r\n            print 'left',\r\n            state = b_turn_left\r\n        if roll > -tilt_angle and roll < tilt_angle:\r\n            print '-----',    \r\n        bt_out(state)\r\n        print state \r\n        old_state = state\r\n        time.sleep(0.2)\r\n\r\n<\/code><\/code><\/pre>\n<p><strong>Ausblick<\/strong><\/p>\n<ul>\n<li>F\u00fcr Indoor k\u00f6nnte man einen Ultraschall Sensor auf das Auto montieren. Dann k\u00f6nnte es automatisch vor (manchen) Hindernissen stoppen und auch die Umgebung mappen. <\/li>\n<li>Per Spannungsteiler am Analogeingang kann das Auto seine Akku-Spannung zur\u00fcck senden.<\/li>\n<li>F\u00fcr Outdoor k\u00f6nnte man das Handy auf das Auto montieren, dank Kompass &#038; GPS kann es dann autonom navigieren und Wegpunkte abfahren<\/li>\n<\/ul>\n<p><iframe loading=\"lazy\" title=\"android + SL4A + python + arduino = Bluetooth Car\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/S4gy3LuyDcg?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/p>\n<p><a href=\"https:\/\/blog.cipworx.org\/laserman\/2013\/01\/30\/bluetooth-auto-forts\/\" title=\"BT-Auto Baubericht Teil 2\">Baubericht Teil 2<br \/>\n<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bastelprojekte, bei denen man keine Teile bestellen muss, weil man alles schon zu hause herumliegen hat, mag ich besonders. Das Bluetooth-Auto in den letzten 3 Tagen war so ein Projekt. Ein Freund gab mit ein &#8220;MGA CLUTCH AXI TRESPASS Land &#038; Sea Fluid 4WD RC&#8221; Spielzeug-Auto f\u00fcr das er keine Fernsteuerung und auch keine funktionierenden [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[132,2],"tags":[],"class_list":["post-1410","post","type-post","status-publish","format-standard","hentry","category-android","category-electronics"],"_links":{"self":[{"href":"https:\/\/blog.cipworx.org\/laserman\/wp-json\/wp\/v2\/posts\/1410","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.cipworx.org\/laserman\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.cipworx.org\/laserman\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.cipworx.org\/laserman\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.cipworx.org\/laserman\/wp-json\/wp\/v2\/comments?post=1410"}],"version-history":[{"count":9,"href":"https:\/\/blog.cipworx.org\/laserman\/wp-json\/wp\/v2\/posts\/1410\/revisions"}],"predecessor-version":[{"id":1417,"href":"https:\/\/blog.cipworx.org\/laserman\/wp-json\/wp\/v2\/posts\/1410\/revisions\/1417"}],"wp:attachment":[{"href":"https:\/\/blog.cipworx.org\/laserman\/wp-json\/wp\/v2\/media?parent=1410"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.cipworx.org\/laserman\/wp-json\/wp\/v2\/categories?post=1410"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.cipworx.org\/laserman\/wp-json\/wp\/v2\/tags?post=1410"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}