- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 10 von 44

Thema: Vorstellung eines aktuellen kleinen Weihnachtsurlaub Projekts (ab 22.12.)

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von i_make_it
    Registriert seit
    29.07.2008
    Ort
    Raum DA
    Alter
    55
    Beiträge
    2.814

    Vorstellung eines aktuellen kleinen Weihnachtsurlaub Projekts (ab 22.12.)

    Vorstellung eines aktuellen kleinen Weihnachtsurlaub Projekts.

    Ich habe zwar schon ein paar Roboter mit jugendlichen gebaut, aber die Altersklasse für dieses Projektes ist neu für mich.
    Die Herausvorderung ist:
    begrenzter Fachwortschatz, Lese- und Schreibanfänger, kein Englisch.
    Bisher nur Rechenregeln für Addition und Subtraktion bekannt (wegen ohmschen Gesetz etc.)
    Noch keine schulischen Physikvorkenntnisse.
    Also ist eine ganz andere Herangehensweise notwendig wie bei Acht- bis Zehntklässlern.

    Momentan laufen die Vorbereitungen.
    Um einen aktuellen Controller zu nehmen und nicht mit Assembler anzufangen, habe ich zwei Arduino Nano Clones und etwas Beiwerk (Sensoren und Motortreiber) besorgt und bin seit dem 4.12. da dran.
    Erstes Fazit: die Arduino Refernz von der Webseite scheint unvollständig zu sein (Oder ich bin wiederholt Blind gewesen) Auf jeden Fall habe ich nur millis() gefunden, das es micros() gibt habe ich dann so ergoogelt.

    Mein Großneffe (7 Jahre) interessiert sich seit neustem für Roboter (Aufräumen, Putzen, Geschirrspülen, Hausaufgaben machen und Treppensteigen soll er können).
    Zu Nikolaus gab es den "Galileo - mein Roboter".
    Das Ding hat zwei Motoren, zwei LEDs, sechs Taster und einen Einschalter.
    Programmiert wird über die Taster.
    Es gibt Programmiermodus an-aus, vor, zurück, links, rechts und Programm start.
    Daß dad natürlich kein richtiger Roboter ist, sondern eher ein Automat mit einer Schrittkettensteuerung ist klar.
    Die Motoren werden ohne Odometrie nur über einen Timer gesteuert. Somit sind dann die Schwenks auch nicht genau 90°,
    sondern beim einen Motor über 100° und beim anderen grob 90°
    Also kleines Projekt für den Einstieg in "richtige" Robotik:
    (Vorgabe meiner Finazministerin: es darf "nichts" {wenig} kosten, damit scheidet Mindstorm aus obwohl schon genug LEGO vorhanden ist)
    Als Exkurs habe ich erst mal ein Beispiel vorgesehen das ihm bekannt ist.
    Da vor der Schule eine Fußgängerampel steht, also erst mal eine Ampelschaltung mit einem Arduino nano und als Erweiterung einen LDR für eine Nachtschaltung (Gelb für die Autos blinkt).
    Mit dem LDR lernt er einen Sensor kennen, der eine Reaktion auf verschiedene äußere Einflüsse ermöglicht.

    Schnell gestricktes Programm, schon mit dem LDR und bewust mit delay Befehlen.
    Code:
    int f_tast = 2;
    int a_rot = 3;
    int a_gelb = 4;
    int a_gruen = 5;
    int f_rot = 8;
    int f_gruen = 9;
    int f_lamp_tast = 13;
    int s_licht = A0;
    
    void setup() {
      pinMode(f_tast, INPUT);
      pinMode(a_rot, OUTPUT);
      pinMode(a_gelb, OUTPUT);
      pinMode(a_gruen, OUTPUT);
      pinMode(f_rot, OUTPUT);
      pinMode(f_gruen, OUTPUT);
    }
    
    void loop() {
      int sensorValue = analogRead(s_licht);
      digitalWrite(f_lamp_tast, HIGH); //Blinker an Taste fuer Fussgaenger
      delay(500);
      digitalWrite(f_lamp_tast, LOW);
      delay(500);
      
      if (sensorValue > 300){ //Dämmerungswert für Nachtschaltung
        digitalWrite(a_rot, LOW);
        digitalWrite(a_gelb, HIGH); //Autos Gelb für Blinker
        digitalWrite(a_gruen, LOW);
        digitalWrite(f_rot, LOW);
        digitalWrite(f_gruen, LOW);
        delay(500);
        digitalWrite(a_gelb, LOW);
      }
      else {
        digitalWrite(a_rot, LOW);
        digitalWrite(a_gelb, LOW);
        digitalWrite(a_gruen, HIGH); //Autos gruen
        digitalWrite(f_rot, HIGH); //Fussgaenger rot
        digitalWrite(f_gruen, LOW);
      }
    
      if (digitalRead(f_tast) == LOW){ //Taste Fussgaenger abfragen
        digitalWrite(13, HIGH); //Taste Fussgaenger ist gedrueckt worden
        digitalWrite(f_rot, HIGH); //Fussgaenger rot
        digitalWrite(a_gruen, LOW);
        digitalWrite(a_gelb, HIGH); //Autos gelb
        delay(1000); // Autos Gelbphase
        digitalWrite(a_gelb, LOW);
        digitalWrite(a_rot, HIGH); //Autos rot
        delay(500); // Fussgaenger Wartezeit damit kein Auto mehr fährt
        digitalWrite(13, LOW);
        digitalWrite(f_rot, LOW);
        digitalWrite(f_gruen, HIGH); //Fussgaenger gruen
        delay (6000); //Fussgaenger gruenphase
        digitalWrite(f_rot, HIGH); //Fussgaenger rot
        digitalWrite(f_gruen, LOW);
        delay(1000); //Autos Wartezeit damit kein Fussgaenger mehr laeuft
        digitalWrite(a_gelb, HIGH); //Autos gelb
        delay(1000); // Autos Gelbphase
      }
    }
    Der Taster für die Fußgänger um grün anzufordern, wird später auf Interrupt umgestellt, da die Delay Befehle ja dafür sorgen, das nur ein langer Tastendruck sicher erkannt wird (bzw. ein Tastendruck der genau zum Zeitpunkt der Abfrage erfolgt).
    Um den Interrupt zu verstehen, gibt es ein kleines Spiel.
    Ich stehe hinter meinem Großneffen und ihm gegenüber stehen seine Eltern.
    Für die zyklische Abarbeitung hält seine Mutter alle 10 Sekunden einen Spigel hin, so da er sehen kann was ich hinter ihm mache.
    (Ich halte von Zeit zu Zeit ein Handtuch hoch)
    Das wird ein paar mal gemacht, dann kommt sein Vater ins Spiel.
    Jedesmal wenn ich ein Handtuch hochhalte sagt er "Alarm", er ist also der Interrupt.

    Die Variante mit Interrupt:
    Code:
    int f_tast = 2;
    int a_rot = 3;
    int a_gelb = 4;
    int a_gruen = 5;
    int f_rot = 8;
    int f_gruen = 9;
    int f_lamp_tast = 13;
    int s_licht = A0;
    byte f_press = HIGH;
    
    void setup() {
    pinMode(f_tast, INPUT);
    pinMode(a_rot, OUTPUT);
    pinMode(a_gelb, OUTPUT);
    pinMode(a_gruen, OUTPUT);
    pinMode(f_rot, OUTPUT);
    pinMode(f_gruen, OUTPUT);
    attachInterrupt(0, button, LOW);
    //Serial.begin(9600);
    }
    
    void loop() {
      int sensorValue = analogRead(s_licht);
      //Serial.println(sensorValue);
      // Blinker code zum Prüfen ob Programm läuft 
      digitalWrite(f_lamp_tast, HIGH); //Blinker an Taste fuer Fussgaenger
      delay(500);
      digitalWrite(f_lamp_tast, LOW);
      delay(500);
      
      if (sensorValue > 500){ //Dämmerungswert für Nachtschaltung
      digitalWrite(a_rot, LOW);
      digitalWrite(a_gelb, HIGH); //Autos Gelb für Blinker
      digitalWrite(a_gruen, LOW);
      digitalWrite(f_rot, LOW);
      digitalWrite(f_gruen, LOW);
      delay(500);
      digitalWrite(a_gelb, LOW);
      }
      else {
      digitalWrite(a_rot, LOW);
      digitalWrite(a_gelb, LOW);
      digitalWrite(a_gruen, HIGH); //Autos gruen
      digitalWrite(f_rot, HIGH); //Fussgaenger rot
      digitalWrite(f_gruen, LOW);
      }
    
      // if (digitalRead(f_tast) == LOW){ //Taste Fussgaenger abfragen
      if (f_press == LOW){ //Statusvariable Taste Fussgaenger abfragen
      delay(500);
      digitalWrite(13, HIGH); //Taste Fussgaenger ist gedrueckt worden
      digitalWrite(f_rot, HIGH); //Fussgaenger rot
      digitalWrite(a_gruen, LOW);
      digitalWrite(a_gelb, HIGH); //Autos gelb
      delay(1000); // Autos Gelbphase
      digitalWrite(a_gelb, LOW);
      digitalWrite(a_rot, HIGH); //Autos rot
      delay(1000); // Fussgaenger Wartezeit damit kein Auto mehr fährt
      digitalWrite(13, LOW);
      digitalWrite(f_rot, LOW);
      digitalWrite(f_gruen, HIGH); //Fussgaenger gruen
      delay (6000); //Fussgaenger gruenphase
      digitalWrite(f_rot, HIGH); //Fussgaenger rot
      digitalWrite(f_gruen, LOW);
      delay(1000); //Autos Wartezeit damit kein Fussgaenger mehr laeuft
      digitalWrite(a_gelb, HIGH); //Autos gelb
      delay(1000); // Autos Gelbphase
      f_press = HIGH;
      }
    }
    void button(){
    f_press = LOW;
    }
    Da der Galileo "Roboter" ja keinerlei Sensorik hat, will ich ihm erst mal zeigen was mit relativ einfachen Mitteln geht.
    Also:
    1- Bumper zu Kollisionserkennung. (ein Paar Mikroschalter aus Computermäusen per Wiederstandsnetzwerk an einem Analogeingang)
    2- Linienfolge Sensor
    3- Ultraschall Sensoren um Entfernungen (Abstände) zu messen.
    4- IR Sharp GP2D120 um Treppenabsätze zu erkennen. (Kinderzimmer ist im ersten Stock)
    (GP2D120 muß ich aber erst besorgen, habe zur Zeit keine mehr übrig)

    Um ein Vorführbeispiel zu haben, habe ich mal mit einem Arduino nano, zwei hc-sr04 Ultraschallmodulem und einem Funduino Tracker Sensor (Linienfolgesensor mit 3 IR Reflexkopplern - TCRT5000)
    ein Funktionsmuster gebaut.
    Code:
    const int us1_echo = 2;
    const int us2_echo = 3;
    const int us1_trig = 4;
    const int us2_trig = 5;
    const int lf_le = 8;
    const int lf_ce = 9;
    const int lf_ri = 10;
    int lf_le_state = LOW;
    int lf_ce_state = LOW;
    int lf_ri_state = LOW;
    unsigned long us1_echo_st;
    unsigned long us2_echo_st;
    unsigned long us1_echo_et;
    unsigned long us2_echo_et;
    unsigned long us1_srt;
    unsigned long us2_srt;
    unsigned long us1_dist;
    unsigned long us2_dist;
    unsigned long prev1micros = 0;
    const long toggleinterval = 1000;
    int togglestate = LOW;
    int us1_flag = 0;
    int us2_flag = 0;
    char* string_[]={"Linefollow:", "US-Echo1:", "US-Echo2:", "Cycletime:"};
    unsigned long prev2micros = 0;
    
    void setup() {
      Serial.begin(9600);
      pinMode(us1_echo, INPUT);
      pinMode(us2_echo, INPUT);
      pinMode(us1_trig, OUTPUT);
      pinMode(us2_trig, OUTPUT);
      pinMode(lf_le, INPUT);
      pinMode(lf_ce, INPUT);
      pinMode(lf_ri, INPUT);
      attachInterrupt(0, US1_ISR, CHANGE);
      attachInterrupt(1, US2_ISR, CHANGE);
    }
    
    void loop() {
      lf_le_state = digitalRead(lf_le);
      lf_ce_state = digitalRead(lf_ce);
      lf_ri_state = digitalRead(lf_ri);
      unsigned long cur1micros = millis();
      if (cur1micros - prev1micros >= toggleinterval) { //alle 10ms umschalten
        prev1micros = cur1micros;
        if (togglestate == LOW){
          togglestate = HIGH;
          digitalWrite(us1_trig, HIGH);
          digitalWrite(us2_trig, LOW);
          us1_echo_st = 0;
          us1_flag = 0;
        }else{ 
          togglestate = LOW;
          digitalWrite(us1_trig, LOW);
          digitalWrite(us2_trig, HIGH);
          us2_echo_st = 0;
          us2_flag = 0;     
        }
      }
       us1_dist = (us1_srt / 58); // Umrechnung des Sensorwerts, ungefähr in  cm (für 343m/s bei trockner Luft und 20° wäre 58,3 der genaue Wert)
      us2_dist = (us2_srt / 58);
      Serial.print(string_[1]);
      Serial.println(us1_dist);
      Serial.print(string_[2]);
      Serial.println(us2_dist);
      Serial.print(string_[0]);
      Serial.print(lf_le_state);
      Serial.print(lf_ce_state);
      Serial.println(lf_ri_state);
      unsigned long cur2micros = micros();
      Serial.print(string_[3]);
      Serial.println(cur2micros - prev2micros);
      prev2micros = cur2micros;
    }
    
    void US1_ISR(){
      if (us1_echo_st == 0) {
        us1_echo_st = micros();
      } else {
        us1_echo_et = micros();
        ++us1_flag;
      }
      if (us1_flag == 1) {
        us1_srt = (us1_echo_et - us1_echo_st);
      }
    } 
    
    void US2_ISR(){
      if (us2_echo_st == 0) {
        us2_echo_st = micros();
      } else {
        us2_echo_et = micros();
        ++us2_flag;
      }
      if (us2_flag == 1) {
        us2_srt = (us2_echo_et - us2_echo_st);
      }
    }
    Ergebniss der Ausgabe:
    US-Echo1:226
    US-Echo2:227
    Linefollow:000
    Cycletime:63440


    Als nächstes kommen die Antriebe dran.
    Da bin ich noch am Überlegen ob gehackte Servos mit Elektronik und Servo Library oder gehackt ohne Elektronik mit H-Brücke als Getriebemotoren.
    Letzeres wäre vom Erklären her einfacher (Modell mit 4 Schaltern).
    Ggf. ja später zwei Mikroservos out of the Box um mit den zwei US-Sensoren eine 360° Überwachung zu realisieren.

    Da ja DC Motoren ohne Regelung nicht besser sind wie bei dem Galileo "Roboter", kommt dann das Innenleben einer Kugelmaus zu neuen Ehren (Odometrie).
    Da Suche ich allerdings noch den Karton wo die alten Mäuse drin sind.
    Als Demonstrationsbeispiel nehme ich eine schwarz gestrichene Pringles Dose bei der man so nicht erkennen kann ob ich sie linksrum oder rechtsrum drehe.
    Dann zwei Reihen Löcher versetzt in den Rand gelocht und eine Lampe (mit Pappblenden) innen rein um zu erkennen in welcher Reihenfolge beim Drehen die Lichter an und aus gehen.
    Geändert von i_make_it (16.12.2015 um 19:53 Uhr)

Ähnliche Themen

  1. Antworten: 2
    Letzter Beitrag: 08.04.2013, 17:22
  2. Frage bezüglich Umsetzung eines UNI-Projekts "MATHE WEC
    Von Jube im Forum Vorstellung+Bilder+Ideen zu geplanten eigenen Projekten/Bots
    Antworten: 15
    Letzter Beitrag: 22.09.2010, 09:21
  3. Vorstellung eines Netzteils
    Von Rasieel im Forum Vorstellung+Bilder+Ideen zu geplanten eigenen Projekten/Bots
    Antworten: 3
    Letzter Beitrag: 21.06.2009, 22:59
  4. [Starthilfe]Bau eines kleinen Roboters
    Von waldwichtel im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 10
    Letzter Beitrag: 05.09.2006, 21:31
  5. bauen eines kleinen robot
    Von rumburack im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 6
    Letzter Beitrag: 07.03.2005, 14:15

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests