Schritt 1: Zusammenfassung


  1. Dieses Projekt wird eine einfache Rover Auto, das von einem Android Smart App mit Sprach Taste oder basierte Befehle aus der Ferne gesteuert werden kann. Die Smart-App eine Verbindung zu einem Bluetooth-Serienmodul auf der Rover-Auto, die wiederum läuft der Servos von einer Anwendung auf dem Intel Edison MCU (Microcontroller Unit) ausgeführt gesteuert.
    Die Mikrosteuereinheit (MCU) auf Edison ist Teil des SOC (Dual Core Atom + die Minute IA basierten MCU). MCU läuft ein Echtzeitbetriebssystem (Viper von Windriver), die wiederum führt eine "MCU-Anwendung", die interessante Dinge wie die Verwaltung von IO-Ports tun können, sammeln und Steuersensordaten usw.
    Es ist ein ausgezeichneter Führer finden Sie hier: Erstellen von Anwendungen mit MCU SDK : (https://software.intel.com/en-us/creating-applications-with-mcu-sdk-for-intel-edison-board), wenn Sie neue, auf Intel-MCU. Der Leitfaden führt Sie durch die Installation der MCU SDK (die getrennt ist von der Eclipse SDK für das Intel Atom ™ Prozessor) und eine Einführung in den Aufbau MCU-Anwendungen.
    Dieses Projekt baut eine einfache rover Roboterauto meist aus der MCU (nur die Bluetooth-Verbindung wird von arduino auf dem Host-CPU mit Befehlen zum MCU für Maßnahmen weitergeleitet behandelt) angetrieben. Da die MCU ist ein Niederfrequenz-Kern (100 MHz max) es kostet viel weniger (in Bezug auf Energieverbrauch), ähnliche Dinge zu tun, und nicht auf dem Host Intel Atom ™ Prozessor (500 MHz max).
    Der Ansatz und die Betonung liegt hier, um eine einfache preisbewusste Konstrukt / zerlegbare Projekt mit so vielen Dingen im Haus wie möglich gebaut zu tun. Mit diesem Geist im Kopf habe ich einen Karton, 2 seitige Klebebänder, Gummibänder verwendet, um das Hauptchassis in Ort und dann zu "befestigen" Edison, Batterie und Steckbrett getrieben Schaltung mit dem Chassis setzen.

Schritt 3: Chassis

  1. MCU-1: Ein preisbewusste Intel Edison MCU basiert Rover-Spielzeug-Auto.  (Intel IoT)

    MCU-1: Ein preisbewusste Intel Edison MCU basiert Rover-Spielzeug-Auto.  (Intel IoT)

    MCU-1: Ein preisbewusste Intel Edison MCU basiert Rover-Spielzeug-Auto.  (Intel IoT)

    Fahrwerk / Servos / Front Kugellager.
    Ich entschied mich für einen einfachen Karton auf Basis-Chassis mit den Servos, es stecken mit 2 seitige Klebebänder mit Gummibändern verstärkt. Es gibt viele Möglichkeiten, die Sie sich hier von der Bestellung Plexiglas vorgeschnitten Chassis mit Kabelbindern anstelle von 2-seitige Klebebänder gehen können - lassen Sie Ihrer Kreativität freien Lauf. Die oben genannten Möglichkeiten zu arbeiten, solange Ihr rover über glatte Oberflächen Roving.

Schritt 4: Akku, Brett

  1. MCU-1: Ein preisbewusste Intel Edison MCU basiert Rover-Spielzeug-Auto.  (Intel IoT)

    MCU-1: Ein preisbewusste Intel Edison MCU basiert Rover-Spielzeug-Auto.  (Intel IoT)

    Montieren Sie diese Freiform und dann später sichern mit dem Chassis mit Gummibändern - überraschend dies funktioniert sehr gut (wir erinnern uns Plan über die Verwendung dieser auf nur glatte Oberflächen - Stellen Sie die nach Ihren Plänen zu befestigen).

Schritt 5: Pin Mappings

  1. MCU-1: Ein preisbewusste Intel Edison MCU basiert Rover-Spielzeug-Auto.  (Intel IoT)

    Wir werden (in erster Linie) werden unter Verwendung auf dem Breakout-Board Pin 0,1,2,3, 5,6.

Schritt 6: Brotschneidebrett - Ultraschall-Entfernungssensor (HC-SR04)

  1. MCU-1: Ein preisbewusste Intel Edison MCU basiert Rover-Spielzeug-Auto.  (Intel IoT)

    MCU-1: Ein preisbewusste Intel Edison MCU basiert Rover-Spielzeug-Auto.  (Intel IoT)

    Starten Sie die Einrichtung Ihres Schaltung - oben zeigt Ultraschallsensor HC-SR04 statisch auf dem Steckbrett montiert (Optionen umfassen legt es auf einem Motor nach links / nach vorn / rechten Seiten scannen, wenn herauszufinden, wo sich zu bewegen nächsten). Verdrahtung ist ziemlich einfach - vcc, Trigger, Echo und Boden.

Schritt 7: Breadboard - Servoanschlüsse

  1. MCU-1: Ein preisbewusste Intel Edison MCU basiert Rover-Spielzeug-Auto.  (Intel IoT)

    MCU-1: Ein preisbewusste Intel Edison MCU basiert Rover-Spielzeug-Auto.  (Intel IoT)

    MCU-1: Ein preisbewusste Intel Edison MCU basiert Rover-Spielzeug-Auto.  (Intel IoT)

    Hier zeigen wir die Verdrahtung für den Anschluss der Servokabel erforderlich - 3 Stiftverbindung, die sich aus dem Servo - rot (VCC), schwarz (Masse) und in meinem Fall weiß (Signal). Das Bild (Servo Verdrahtung 1) zeigt die 220uF Kondensator, der zwischen Vcc / Masse verbunden ist - dies wird für jedes Servo, um die Probleme zu vermeiden brownout benötigt. Da wir mit dem gleichen Batteriequelle, um die Servos und das Bordnetz; auf plötzliche rover Wende Richtungen kann es Spitzen von Stromverbrauch, die dazu führen können das Board zu recyceln, wenn wir nicht eine beträchtliche Kondensator sein (220uF funktioniert gut in unserem Fall). Die Bilder zeigen Verdrahtung für 1 Servo ohne Servokabel angeschlossen (Servo Verdrahtung 1); mit dem Servo-Kabel angeschlossen (Servo Verdrahtung 2) und dann sowohl die Servokabel angebracht.

Schritt 8: Breadboard - Bluetooth Serial Module (CS-HC-05)

  1. MCU-1: Ein preisbewusste Intel Edison MCU basiert Rover-Spielzeug-Auto.  (Intel IoT)

    MCU-1: Ein preisbewusste Intel Edison MCU basiert Rover-Spielzeug-Auto.  (Intel IoT)

    Die obigen Bilder zeigen den Anschluss für die Bluetooth-Modul - wir verwenden nur VCC, Boden, TxD und RxD - TxD / RxD gehen, 1TX Pins auf der Platine jeweils 0rx Edison.

Schritt 9: Code - MCU-Anwendung.

  1.   {{{
    
     <P> #include "mcu_api.h" <br> #include "mcu_errno.h" </ p> <p> #define INPUT 0
     #define OUTPUT 1 </ p> <p> int echoPin = 128;  // 2
     int trigPin = 13;  // 5
     int blinkPin = 40;  // 13
     int leftMotor = 0;  // PWM3
     int rightMotor = 2;  // Pwm6
     unsigned long StartT, Endt, elapTime, stoptime, tmpTime1;
     unsigned long counter = 1; </ p> <p> Leere pulseIn2 (unsigned int Zustand, int timeout) {
    	 int count = Timeout;
    	 while (gpio_read (echoPin)! = Zustand && count> 0)
    		 count--;
     } </ P> <p> Leere turnleft (int leftMotor, int rightMotor, int Dauer) {
    	 pwm_configure (leftMotor, 2000000, 20000000);
    	 pwm_configure (rightMotor, 2000000, 20000000);
    	 pwm_enable (leftMotor);
    	 pwm_enable (rightMotor);
    	 mcu_sleep (Dauer);
     } </ P> <p> Leere turnright (int leftMotor, int rightMotor, int Dauer) {</ p> <p> pwm_configure (leftMotor, 700000, 20000000);
    	 pwm_configure (rightMotor, 700000, 20000000);
    	 pwm_enable (leftMotor);
    	 pwm_enable (rightMotor);
    	 mcu_sleep (Dauer);
     } </ P> <p> void los (int leftMotor, int rightMotor) {</ p> <p> gpio_write (blinkPin, 0); </ p> <p> pwm_configure (leftMotor, 700000, 20000000);
    	 pwm_configure (rightMotor, 2000000, 20000000);
    	 pwm_enable (leftMotor);
    	 pwm_enable (rightMotor); </ p> <p>} </ p> <p> Leere Rückseite (int leftMotor, int rightMotor, int Dauer) {
    	 gpio_write (blinkPin, 1); </ p> <p> pwm_configure (leftMotor, 2000000, 20000000);
    	 pwm_configure (rightMotor, 700000, 20000000);
    	 pwm_enable (leftMotor);
    	 pwm_enable (rightMotor);
    	 mcu_sleep (Dauer);
     } </ P> <p> Leere Stoppmotors (int leftMotor, int rightMotor) {
     // Host_send ((unsigned char *) "Stopped \ n", 8); </ p> <p> pwm_disable (leftMotor);
    	 pwm_disable (rightMotor);
     } </ P> <p> Leere incrStopTime (int Reset) {
    	 if (tmpTime1> 0) {
    		 stoptime + = (time_ms () - tmpTime1);
    		 wenn (Reset) tmpTime1 = 0;
    		 sonst tmpTime1 = time_ms ();
    	 };
     } </ P> <p> Leere mcu_main () {
    	 unsigned int runMotor = 1;
    	 unsigned char btInput = 0;
    	 char buf [64];
    	 int len;
    	 unsigned long distTraveled;
    	 / * Konfigurationscode beginnt hier * /
    	 StartT = time_ms ();
    	 elapTime = time_ms ();
    	 stoptime = 0; </ p> <p> gpio_setup (echoPin, INPUT);  // In
    	 gpio_setup (trigPin, OUTPUT);  // Out
    	 gpio_setup (blinkPin, OUTPUT);  // Out </ p> <p> while (1) {
    		 mcu_sleep (50);
    		 btInput = 0;
    		 len = host_receive ((unsigned char *) buf, 64);
    		 wenn (LEN> 0) {
    			 btInput = (char) buf [0];
    			 Schalter (btInput) {
    			 Fall 'S':
    				 gpio_write (blinkPin, 1);
    				 Stoppmotors (leftMotor, rightMotor);
    				 tmpTime1 = time_ms ();
    				 runMotor = 0;
    				 brechen; </ p> <p> Bei 'A':
    				 gpio_write (blinkPin, 1);
    				 gehen (leftMotor, rightMotor);
    				 runMotor = 1;
    				 incrStopTime (1);
    				 brechen; </ p> <p> Bei 'L':
    				 gpio_write (blinkPin, 1);
    				 turnleft (leftMotor, rightMotor, 95);
    				 gehen (leftMotor, rightMotor);
    				 runMotor = 1;
    				 incrStopTime (1); </ p> <p> break;
    			 Fall 'R':
    				 gpio_write (blinkPin, 1);
    				 // Reverse (1000);
    				 // Stoppmotors ();
    				 turnright (leftMotor, rightMotor, 95);
    				 gehen (leftMotor, rightMotor);
    				 runMotor = 1;
    				 incrStopTime (1); </ p> <p> break;
    			 Fall 'B':
    				 gpio_write (blinkPin, 1);
    				 turnleft (leftMotor, rightMotor, 95);
    				 turnleft (leftMotor, rightMotor, 95);
    				 gehen (leftMotor, rightMotor);
    				 runMotor = 1;
    				 incrStopTime (1);
    				 brechen;
    			 Standard:
    				 brechen;
    			 }
    		 }
    		 if (runMotor) {
    			 gpio_write (trigPin, 0);
    			 gpio_write (trigPin, 1); </ p> <p> gpio_write (trigPin, 0); </ p> <p> pulseIn2 (1, 10000);
    			 Langstarttime = TIME_US (); </ p> <p> pulseIn2 (0, 10000);
    			 lang = endTime TIME_US ();
    			 int Dauer = endTime - starttime; </ p> <p> int Abstand = Dauer / 29.02;  //29.1? </ P> <p> if ((Abstand! = 0) && (Abstand <15)) {
    				 reverse (leftMotor, rightMotor, 95);
    				 Stoppmotors (leftMotor, rightMotor);
    				 turnleft (leftMotor, rightMotor, 95);
    				 gehen (leftMotor, rightMotor);
    			 } Else {
    				 gehen (leftMotor, rightMotor);
    			 }
    		 }
    		 Endt = time_ms ();
    		 if ((Endt - StartT)> 10000) {
    			 incrStopTime (0);
    			 StartT = time_ms ();
    			 distTraveled = (Endt - elapTime - stoptime) * 12/60000;  // Basierend auf statischen RPM von Servos ungefähre Feed angetrieben.
    		 };
    		 len = mcu_snprintf (buf, 16, "% d \ n", distTraveled);
    		 host_send ((unsigned char *) buf, len);
    	 }
     } </ P>
     }}} 

Schritt 10: Code - Arduino Bluetooth-Kommunikation.

  1.   {{{
    
     <P> int btInput; <br> int StartT, Endt, count = 0;
     int Füßen;
     FILE * fp; </ p> <p> Leere setup () {
       // Ihre Setup-Code hier setzen, einmal ausgeführt:
       Serial1.begin (9600);
       Serial.begin (9600);
       StartT = millis ();
       System ("echo 0> / tmp / edRover");
     } </ P> <p> Leere Schleife () {
       // Stellen Sie Ihre Haupt-Code hier, um wiederholt ausführen:
       Endt = millis ();  zählen ++;
       if (Endt - StartT> 11000) {
         fp = fopen ("/ tmp / edRover", "R");
         StartT = millis ();
         fscanf (fp, "% d", & Fuß);
         Serial1.println (Fuß);
         fclose (fp);
       }
       Verzögerung (500);
       System ("lesen Füße </ dev / ttymcu0; echo $ Füße> / tmp / edRover"); </ p> <p> btInput = 0;
       if (Serial1.available ()> 0) {
         btInput = Serial1.read ();
         Serial.println (btInput);
       } </ P> <p> Schalter (btInput) {
         Fall 'S':
           System ("echo" S "> / dev / ttymcu0");
           brechen; </ p> <p> Bei 'A':
           System ("echo 'A'> / dev / ttymcu0");
           brechen; </ p> <p> Bei 'L':
           System ("echo 'L'> / dev / ttymcu0");
           brechen; </ p> <p> Bei 'R':
           System ("echo" R "> / dev / ttymcu0");
           brechen; </ p> <p> Bei 'B':
           System ("echo" B "> / dev / ttymcu0");
           brechen; </ p> <p> default:
           brechen;
       } </ P> <p>} </ p>
     }}} 

Schritt 11: Code - MIT App Inventor 2 (Visual Programming)

  1. MCU-1: Ein preisbewusste Intel Edison MCU basiert Rover-Spielzeug-Auto.  (Intel IoT)

    MCU-1: Ein preisbewusste Intel Edison MCU basiert Rover-Spielzeug-Auto.  (Intel IoT)

    MIT App Inventor ist eine ausgezeichnete Cloud-basierten Smart-App-Entwicklungs-Tool. Ich habe diese auf die Android SmartApp, die Remote-Kommunikation funktioniert mit der Rover-Auto (via Stimme Taste oder basiert) erstellen. Bitte gehen Sie hier, um mehr über das Tool zu lernen: http://appinventor.mit.edu/explore/get-started?
    Sobald Sie besser vertraut mit arbeiten Sie Ihren Weg durch die Werkzeugumgebung sind - einen Blick auf die gesamte "Quelle" Code für die intelligente app, die wir in diesem Projekt.
    Die Bilder zeigen die ganze Designer und Blöcke angezeigt werden für die android SmartApp. Sie können diese nutzen, um zu bauen und zu installieren apk auf Ihrem Smart Gerät mit Android, um den Roboter zu steuern.

Schritt 12: Code - Init-Skripten, um das Setup-Pins für MCU.


  1. https://software.intel.com/en-us/node/557356
    Laden Sie die Init-Skripte aus den obigen Link - werden wir in erster Linie mit der digitalen und pwm diejenigen.
    Schreiben Sie Ihren eigenen Wrapper-Shell-Skript mit über heruntergeladene Skripts.
    zB
      {{{
    
    echo "on"> /sys/devices/pci0000\:00/0000\:00\:17.0/power/control
    <Path_to_your_downloaded_scripts> /pwm/init_PWM.sh <Path_to_your_downloaded_scripts> /gpio/init_DIG.sh -o 13 -d Ausgabe <Path_to_your_downloaded_scripts> /gpio/init_DIG.sh -o -d 2 Eingangs <Path_to_your_downloaded_scripts> /gpio/init_DIG.sh -o 5 -d Ausgabe
    }}}

Schritt 13: Dass sie alle zusammen.

    1. Erstellen Sie und laden Sie die Arduino Sketch auf die Platine. Erstellen Sie und laden Sie die MCU Anwendungscode zu Edison MCU. Beim Neustart - Gewährleistung der Rover nicht weglaufen, sobald die unter Init-Skripte ausgeführt wurden - heben Sie sie seinen Rädern. Melde dich an, und führen Sie die Init-Skripte, um das Setup GPIO (Ich habe ein Wrapper-Skript Ich laufe - mit dem Schritt oben). An diesem Punkt sollten Sie eine einfache Hindernisvermeidung rover Arbeits haben - es gibt keine Fernbedienung Fähigkeit. Bauen und installieren Sie die von der App Inventor 2 auf Ihrem Android-Smart Device generiert apk. Auf Ihrem Gerät Paar mit dem Bluetooth-Modul (Standardschlüssel lautet 1234). Inbetriebnahme Ihrer Anwendung und eine Verbindung mit dem gepaarten Bluetooth-Verbindung. An diesem Punkt sollten Sie zum Fernsteuern der Rover mit Sprach- oder Handtaste drückt sein.