Heute hatte ich endlich Zeit, das RaspberryCar weiter zu entwicklen.
Da für alle Bauteile der Platz auf der Chassis nicht gereicht hat, habe ich mir diese beiden Holzplatten gesägt. Ich möchte das Raspberry Car auf 2 Ebenen aufbauen. Unten soll die komplette Schaltung aufgebaut werden und oben die Akkus und die Webcam.
Auch habe ich die Lenkung jetzt mittels des Relays gemacht. Dies funktioniert genauso wie der Antrieb. Meine Batterien zum betreiben liegen bisher nur oben drauf, mit Klebeband zusammengeklebt. Meine Akkufächer wurden schon versand und werden Montag oder Dienstag eintreffen.
Hier auf dem Foto sieht man auch das Gehäuse des Raspberry Pis. Das, das ich schon hatte, besitzt unten zwei Ösen, um ihn irgendwo einhängen zu können. Sehr nützlich, auch wenn ich darauf beim Kauf gar nicht geachtet hatte, kann ich sie nun super benutzen.
Danach habe ich alles auf die Chassis gebaut und verschraubt.
Das Breadboard habe ich zu diesem Zweck in seine drei Einzelteile zerlegt und auf das Brett geklebt.
Zum Abschluss noch die zweite Ebene oben draufgeschraubt und die Akkus befestigt.
Zeit für die zweite Probefahrt (noch ohne Lenkung).
Hier das Bild mit meinen vorübergehenden Batterien/Akkus.
Die beiden AA-Batterien sind mit Thesafilm zusammengeklebt und mit Drähten verbunden. Sie dienen zur Stromversorgung für den Antrieb. Der 9V Block ist für die Lenkung, soll aber noch in 4xAA ersetzt werden, sobald die Batteriefächer da sind. Der EasyAcc ist für den RaspberryPi zuständig.
Nun zur Software:
Dies war für mich ein wenig schwerer, da ich mit Javascirpt noch fast keine Erfahrungen habe. Meist habe ich den Code nur benutzt, um irgendetwas darzustellen oder zu verändern, und selbst hier einfach Copy&Paste verwendet.
Den HttpRequest habe ich schon gehabt. Mit MouseOver hätte ich nun aber 6 Pfeile benötigt. Linksvor, -zurück, Rechtsvor, -zurück und Vor/Zurück. Leichter wäre es daher mit Tastendruck. Z.B. „WASD“, wie beim Gaming. Kurz gegoogelt und auf folgende Seite gestoßen:
http://florianherlings.de/artikel/tastendruck_mit_javascript_abfangen
Sehr schön erklärt und ich konnte es sofort verwenden. Nach einigem Herumprobieren konnte ich folgendes Programmieren:
1. Datei:
- fahren.html
- muss mit einem Webbrowser (getestet habe ich nur mit Firefox) aufgerufen werden
- Eingabe mittels Tastendruck zum Bewegen des Autos
- Enthält das Javascript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 |
<html> <head> <title>RaspberryCar</title> <script type="text/javascript"> document.onkeydown = function(event) { var xmlhttp = null; // Mozilla if (window.XMLHttpRequest) { xmlhttp = new XMLHttpRequest(); } // IE else if (window.ActiveXObject) { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } // Verschiedenen Ausfuehrungen // Zurueck if (event.keyCode == 83) { xmlhttp.open("GET", 'fahren.php?what_start=zurue ck', true); } // Vor else if (event.keyCode == 87) { xmlhttp.open("GET", 'fahren.php?what_start=vor', true); } // Rechts else if (event.keyCode == 68) { xmlhttp.open("GET", 'fahren.php?what_start=recht s', true); } // Links else if (event.keyCode == 65) { xmlhttp.open("GET", 'fahren.php?what_start=links ', true); } xmlhttp.onreadystatechange = function() { if(xmlhttp.readyState != 4) { $('ergebnis').innerHTML = 'Seite wird geladen ...'; } if(xmlhttp.readyState == 4 && xmlhttp.status == 200) { $('ergebnis').innerHTML = xmlhttp.responseText; } } xmlhttp.send(null); } document.onkeyup = function(event) { var xmlhttp = null; // Mozilla if (window.XMLHttpRequest) { xmlhttp = new XMLHttpRequest(); } // IE else if (window.ActiveXObject) { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } // Verschiedenen Ausfuehrungen // Zurueck if (event.keyCode == 83) { xmlhttp.open("GET", 'fahren.php?what_stop=zuruec k', true); } // Vor else if (event.keyCode == 87) { xmlhttp.open("GET", 'fahren.php?what_stop=vor', true); } // Rechts else if (event.keyCode == 68) { xmlhttp.open("GET", 'fahren.php?what_stop=rechts ', true); } // Links else if (event.keyCode == 65) { xmlhttp.open("GET", 'fahren.php?what_stop=links' , true); } xmlhttp.onreadystatechange = function() { if(xmlhttp.readyState != 4) { $('ergebnis').innerHTML = 'Seite wird geladen ...'; } if(xmlhttp.readyState == 4 && xmlhttp.status == 200) { $('ergebnis').innerHTML = xmlhttp.responseText; } } xmlhttp.send(null); } </script> </head> <body> <center> <input type="text" size="3"> </center> </body> root@raspberrypi:/var/www/raspberrycar# cat fahren.html <html> <head> <title>RaspberryCar</title> <script type="text/javascript"> document.onkeydown = function(event) { var xmlhttp = null; // Mozilla if (window.XMLHttpRequest) { xmlhttp = new XMLHttpRequest(); } // IE else if (window.ActiveXObject) { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } // Verschiedenen Ausfuehrungen // Zurueck if (event.keyCode == 83) { xmlhttp.open("GET", 'fahren.php?what_start=zurueck', true); } // Vor else if (event.keyCode == 87) { xmlhttp.open("GET", 'fahren.php?what_start=vor', true); } // Rechts else if (event.keyCode == 68) { xmlhttp.open("GET", 'fahren.php?what_start=rechts', true); } // Links else if (event.keyCode == 65) { xmlhttp.open("GET", 'fahren.php?what_start=links', true); } xmlhttp.onreadystatechange = function() { if(xmlhttp.readyState != 4) { $('ergebnis').innerHTML = 'Seite wird geladen ...'; } if(xmlhttp.readyState == 4 && xmlhttp.status == 200) { $('ergebnis').innerHTML = xmlhttp.responseText; } } xmlhttp.send(null); } document.onkeyup = function(event) { var xmlhttp = null; // Mozilla if (window.XMLHttpRequest) { xmlhttp = new XMLHttpRequest(); } // IE else if (window.ActiveXObject) { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } // Verschiedenen Ausfuehrungen // Zurueck if (event.keyCode == 83) { xmlhttp.open("GET", 'fahren.php?what_stop=zurueck', true); } // Vor else if (event.keyCode == 87) { xmlhttp.open("GET", 'fahren.php?what_stop=vor', true); } // Rechts else if (event.keyCode == 68) { xmlhttp.open("GET", 'fahren.php?what_stop=rechts', true); } // Links else if (event.keyCode == 65) { xmlhttp.open("GET", 'fahren.php?what_stop=links', true); } xmlhttp.onreadystatechange = function() { if(xmlhttp.readyState != 4) { $('ergebnis').innerHTML = 'Seite wird geladen ...'; } if(xmlhttp.readyState == 4 && xmlhttp.status == 200) { $('ergebnis').innerHTML = xmlhttp.responseText; } } xmlhttp.send(null); } </script> </head> <body> <center>Zum Bewegen des RaspberryCars "WASD" benutzen.</center> </body> </html>r |
Dieses Skript benötigt als HTTPRequest Empfängerdatei noch die fahren.php, die daraufhin die GPIOs öffnet, bzw. schließt.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
<?php if(isset($_GET["what_start"])) { $what_start = $_GET["what_start"]; } if(isset($_GET["what_stop"])) { $what_stop = $_GET["what_stop"]; } // Starten if($what_start == "zurueck") { shell_exec('gpio -g write 17 0'); } elseif($what_start == "vor") { shell_exec('gpio -g write 18 0'); } elseif($what_start == "rechts") { shell_exec('gpio -g write 14 0'); } elseif($what_start == "links") { shell_exec('gpio -g write 15 0'); } // Stoppen if($what_stop == "zurueck") { shell_exec('gpio -g write 17 1'); } elseif($what_stop == "vor") { shell_exec('gpio -g write 18 1'); } elseif($what_stop == "rechts") { shell_exec('gpio -g write 14 1'); } elseif($what_stop == "links") { shell_exec('gpio -g write 15 1'); } ?> |
Mit diesen beiden Dateien kann ich nun
- Vorwärts,
- Rückwärts,
- Rückwärts rechts,
- Rückwärts links,
- Vorwärts rechts,
- und Vorwärts links
fahren. Leider kann ich nur mit Vollgas fahren, das ist bisher aber noch nicht schlimm, da die 2,4V das nun sehr schwere Auto eh nicht schnell bewegen können. Kurvenfahren ist auch nicht das größte Vergnügen, da die Kraft des 9V Blocks nicht ausreicht, um die Lenkung komplett einschlagen zu lassen. Ggf. löst sich das aber mit einem 4,8 V AA Block.
Ich werde auf jeden Fall einen weiteren Beitrag schreiben, wenn die Batteriefächer geliefert wurden.