- 3D-Druck Einstieg und Tipps         
Seite 4 von 7 ErsteErste ... 23456 ... LetzteLetzte
Ergebnis 31 bis 40 von 64

Thema: fahrzeug mit vier motoren und vier encodern

  1. #31
    Benutzer Stammmitglied
    Registriert seit
    19.05.2015
    Beiträge
    69
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo inka,

    "255/2+3" bedeutet das der Duty Cycle ca 51% lang ist. War in Gedanken wohl noch bei Brüchen und Prozent, da schreib ich schonmal sowas umständlich. Aber der Compiler rechnet das ja zur Übersetzungszeit aus, da kann man das mal machen.

    Zu den for()-Schleifen, die sind so gedacht, so kann man z.B.
    Code:
    // Fuer die linke Seite
    for(uint8_t idx = M_VL; idx < M_VR; idx++) {
        motor_stop(idx);
    }
    
    // Fuer die rechte Seite
    for(uint8_t idx = M_VR; idx < M_MAX; idx++) {
        motor_stop(idx);
    }
    machen. Sprich die Indexe geben an, mit welcher Seite man arbeitet. Die Funktion/en im Schleifenrumpf beschreibt/en was passieren soll.

    Falls Du Lust und die Zeit hast, wäre es gut, wenn Du nochmal in 'nem C-Buch oder Tutorial nachschlägst, was Arrays (dt. Felder) sind und wie man sie benutzt. Das gleiche gilt für Strukturen (struct) und Aufzählungstypen (enum), diese drei Dinge spielen hier mit den Funktionen zusammen.

    Grüße
    Chris

  2. #32
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    hi botty,
    Code:
    #include <AFMotor.h>
    
    // Motor
    AF_DCMotor motor(4);
    // Die Anzahl der Flankenwechsel
    volatile unsigned long ticks = 0;
    // passender Encode Pin für den Motor
    static const uint8_t enc_pin = 18;
    
    /*
     * Die Interrupt Routine die beim Flankenwechsel aufgerufen wird
     */
    void motor_isr(void){
      ticks++;
    }
    
    /*
     * Serial und den Pin initialisieren, die Interrupt Routine 
     * zuordnen.
     */
    void setup() {
      Serial.begin(9600);
      pinMode(enc_pin, INPUT_PULLUP);
      attachInterrupt(digitalPinToInterrupt(enc_pin), motor_isr, CHANGE);
    
      Serial.println("setup fertig");
    }
    
    void loop() {
      unsigned long start_zeit, regel_zeit, aktions_zeit;
      /*
       * Ticks beschreiben, dabei wollen wir nicht von einem 
       * Interrupt unterbrochen werden
       */
      noInterrupts();
      ticks = 0;
      interrupts();
    
      motor.setSpeed(130);
      motor.run(FORWARD);
    
      Serial.println("ticks initialisiert und Motor laeuft");
    
      /*
       * Fuer 10 sec "Regeln" und eine andere Aktion parallel
       * dazu ausführen.
       */
      start_zeit = regel_zeit = aktions_zeit = millis();
      while(start_zeit + 10000 > millis() ) {
        /*
         * Motor "regeln" alle 0,5sec
         */
        static const unsigned long rdiff = 500;
        if(regel_zeit + rdiff <= millis()) {
          regel_zeit = rdiff + millis(); // nächstes Intervall setzen.
          Serial.print(millis());
          Serial.print(": Regeln ");
    
          /*
           * Wir lesen unseren Zaehler und wollen nicht
           * von Interrupts gestört werden
           */
          noInterrupts();
          unsigned long tmp = ticks;
          interrupts();
          
          Serial.println(tmp);
        }
    
        /*
         * Die andere Aktion die Parallel zum "Regeln" ausgeführt wird
         * und nur unterbrochen wird, wenn ein Interrupt auftritt.
         */
         static const unsigned long adiff = 333;
         if(aktions_zeit + adiff <= millis()) {
          aktions_zeit = adiff + millis(); // Nächste Intervall setzen
    
          // Hier irgendetwas anderes machen
          Serial.print(millis());
          Serial.println(": andere Aktion");
         }
      }
    
      Serial.println("Motor stop");
      
      motor.setSpeed(0);
      motor.run(RELEASE);
      
      delay(2000);
    }
    im zusammenhang mit diesem sketch versuche ich die ausgabezeiten meiner serial.print befehle zu verkürzen, ähnlich diesem hier (das ist doch der hintergrund, oder?):
    Code:
       // Ticks und Strecke ausgeben
        static const int wtime = 250;
        if(log_time + wtime <= millis() ) 
        {
          out_s = "";
          out_s += millis() + ": ";
    
          for(uint8_t idx = M_VL; idx < M_MAX; idx++) 
          {
            out_s += idx + " ";
            out_s += motoren[idx].ticks + " ";  // Hier koennte jetzt ein Interrupt unterbrechen!
            out_s += motor_strecke_gefahren(idx);
    
            ticks_tmp = 0;
            motor_ticks_per_milli(idx, &ticks_tmp);
            out_s += " " + ticks_tmp;
    
            if(idx == M_MAX - 1)
              out_s += "\n";
            else
              out_s += ", ";
          }
    
          for(uint8_t idx = 0; idx < M_MAX; idx++)
            all_ticks_tmp[idx] = 0;
            
          motor_ticks_per_milli_fuer_alle(all_ticks_tmp, M_MAX);
    
          for(uint8_t idx; idx < M_MAX; idx++)
            out_s += all_ticks_tmp[idx] + " ";
    
          Serial.println(out_s);
    
          log_time = wtime + millis();
        }
    da werden ja verschiedene ausgaben zu einem string "addiert" und dann als ganzes ausgedruckt. Beim einsatz dieser zeilen:

    Code:
    out_VL += " " + millis();
    out_VL += " " + tmp_VL;
    out_VL += " "+ tmp_VL_ges;
    out_VL += " " + v;
    Serial.print (out_VL);
    kommt aber etwas ähnliches im serial monitor wie das hier:

    Code:
    setup fertig 
    ticks_VL initialisiert und Motor_VL laeuft 
    333: andere Aktion 
    500: motor dreht schneller: 102 
      999: andere Aktion 
    1500: motor dreht schneller: 104 
      nfnf�1665: andere Aktion 
    2331: andere Aktion 
    2500: motor dreht schneller: 106 
      nfnf�on 
    00: motor dreht schneller: 106 
    dere Aktion 
    31: ander��2997: andere Aktion 
    3500: motor�setup fertig 
    ticks_VL initialisiert und Motor_VL laeuft 
    335: andere Aktion 
    502: motor dreht schneller: 102 
    1001: andere Aktion 
    1502: motor dreht schneller: 104 
    7o_��i����i__��߱������i�:�x�[�W����>:3�ԯ��������k�����=EM|-v�Zz/�n��o�)}���W�v��!>������?+���,���Z��~�{��vN�s�}�1�3N���n5��v�s�KO��u���:���{m��߾�����?g������_�k� �{��g��=^�{7����w��5wr�W?_ky���ܻ���s|4��u�.����D�\·�=���li�����R�~����t��?ٵ���I|,�R�؟��Մn�Wڎ^7��Ÿ�����C9������������4�Z������7�?�eh>�������~y������������Jz ~�>_�~�����FZ{��G����������i����'�� 'ܿ��'/o�������ۖ�W�G�/~-�o���6o�uFl�>l��������/D�E�^أ�O�{��=�#���1���Nw�Cq̎���E�\�h����<|������[q��vx\���׿�~������{�����{�{��Ol��}d��u_������,�}���iH?����eU=�7A������O,a���9������Y���|�L}�e^X��^���n�j>���R����������r������<i�������K�?z:�ϗ�#�j�;�\׿ߍb���������}W�?�m�O���릟���b���y���,�"�����{���ֽ}��ۚ����;M��s�K��Z��[�8�Ү���sW�u�׿j,�3,~Ⱥ/���[��m���_��-� ~���y{k�T���F��������/�u��(>��tv�WJ��g��zgF�����ۅ�+��|��T�S���緖��>�-�Zcпm���`�%�{���p��������c��ϗ������Wm)���\ܲ�γ������v��~_)���n'�?����+�=������zZG^��'�z�H���N{7����w��5wr�W?_ky�޷ܻ���s|4��u�.�ī�D�\���=���li�����R�~����t��?ٵ���I|,�R�؟��Մn�W��^7��Ÿ�����C9���������
    muss man vor dem addieren nicht die arten der ausgaben in eine gleiche art umwandeln?
    gruß inka

  3. #33
    Benutzer Stammmitglied
    Registriert seit
    19.05.2015
    Beiträge
    69
    Hallo,

    ursprünglich war das so mit demString gedacht. Leider scheint die String-Klasse in der Arduino Umgebung einige Quirks zu haben, die zu diesem Kuddelmuddel führen können. Da ich zwar schon 'ne Weile programmiere aber neu in der Arduino Welt bin, lerne ich diese Besonderheiten gerade erst kennen.

    Zu Deiner Frage der Umwandlung: eigentlich sollte das die String-Klasse mit ihren überladenen '+' und '+=' Operatoren automatisch machen, leider klappt das nicht immer sauber.

    Erstmal muß man den String wohl immer ordentlich initialisieren
    Code:
    String out_s = String("Init"); // mindestens
    
    String other = String();
    ob die letztere Variante als ordentlich gilt, kann ich hier gerade nicht probieren.

    Außerdem steht in der Doku:
    Caution: You should be careful about concatenating multiple variable types on the same line, as you may get unexpected results.
    sprich wenn ich mit '+' zwei unterschiedliche Datentypen "addiere", kann besagter Kuddelmuddel rauskommen. Das Gleiche gilt wohl auch für '+='
    https://www.arduino.cc/en/Tutorial/S...ditionOperator

    sicherer ist wohl immer nur einstellig zu arbeiten
    Code:
    String out_VL = String(" "); // keinen Leerstring verwenden
    
    out_VL += millis();
    out_VL += " "; out_VL += tmp_VL;
    out_VL += " "; out_VL += tmp_VL_ges;
    out_VL += " "; out_VL += v;
    
    Serial.print (out_VL);
    Serial.flush()
    Ist zwar mehr Tipparbeit aber spart einem die Zeit beim Suchen wenn es mal nicht klappt.

    Sollte das trotzdem nicht gehen, dann bleibt einem nix anderes übrig als das gewohnte Serial.print/ln zu verwenden.
    Außerdem wäre es gut, die Baudrate so hoch wie möglich einzustellen. Also Serial.begin(115200) oder höher und entsprechend im Serial Monitor abändern.

    Gruß

    Chris
    Geändert von botty (18.11.2015 um 13:00 Uhr)

  4. #34
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    hi,

    ich habe jetzt die ausgabe routine so abgeändert:

    Code:
    // Ticks und Strecke ausgeben
        static const int wtime = 250;
        if(log_time + wtime <= millis() ) 
        {
          String out_s = String("");
          out_s += millis(); out_s += ": ";
    
          for(uint8_t idx = M_VL; idx < M_MAX; idx++) 
          {
            out_s += idx; out_s += " ";
            out_s += motoren[idx].ticks; out_s += " ";  // Hier koennte jetzt ein Interrupt unterbrechen!
            out_s += motor_strecke_gefahren(idx);
    
            ticks_tmp = 0;
            motor_ticks_per_milli(idx, &ticks_tmp);
            out_s += " "; out_s += ticks_tmp;
    
            if(idx == M_MAX - 1)
              out_s += "\n";
            else
              out_s += ", ";
          }
    
          for(uint8_t idx = 0; idx < M_MAX; idx++)
            all_ticks_tmp[idx] = 0;
            
          motor_ticks_per_milli_fuer_alle(all_ticks_tmp, M_MAX);
    
          for(uint8_t idx; idx < M_MAX; idx++)
            out_s += all_ticks_tmp[idx]; out_s += " ";
    
          Serial.print(out_s);
    
          log_time = wtime + millis();
        }
    das ist die ausgabe:

    Code:
    250 293.03 0, 1 418 229.81 0, 2 494 271.59 0, 3 396 217.71 0
     210.57 0, 1 282 155.04 0, 2 355 195.17 0, 3 260 142.94 0
     3762: 0 533 293.03 0, 1 418 229.81 0, 2 494 271.59 0, 3 396 217.71 0
     250: 0 33 18.14 0, 1 16 8.80 0, 2 24 13.19 0, 3 17 9.35 0
     752: 0 172 94.56 0, 1 109 59.93 0, 2 144 79.17 0, 3 88 48.38 0
     1254: 0 324 178.13 0, 1 231 127.00 0, 2 280 153.94 0, 3 206 113.25 0
     1756: 0 477 262.24 0, 1 364 200.12 0, 2 415 228.16 0, 3 340 186.92 0
     2258: 0 630 346.36 0, 1 506 278.19 0, 2 558 306.78 0, 3 483 265.54 0
     2760: 0 783 430.48 0, 1 654 359.56 0, 2 698 383.75 0, 3 632 347.46 0
     3262: 0 937 515.14 0, 1 801 440.37 0, 2 839 461.26 0, 3 781 429.38 0
     3764: 0 1088 598.16 0, 1 951 522.84 0, 2 982 539.88 0, 3 933 512.94 0
     4267: 0 1239 681.18 0, 1 1102 605.86 0, 2 1126 619.05 0, 3 1083 595.41 0
     4769: 0 1394 766.39 0, 1 1257 692.17 0, 2 1266 696.02 0, 3 1231 676.78 0
     5271: 0 1541 847.21 0, 1 1410 775.19 0, 2 1409 774.64 0, 3 1377 757.05 0
     5773: 0 1693 930.78 0, 1 1569 862.60 0, 2 1550 852.16 0, 3 1526 838.96 0
     6275: 0 1849 1016.54 0, 1 1726 948.92 0, 2 1693 930.78 0, 3 1672 919.23 0
     6777: 0 1997 1097.91 0, 1 1881 1034.13 0, 2 1832 1007.19 0, 3 1827 1004.45 0
     7280: 0 2146 1179.83 0, 1 2035 1118.80 0, 2 1972 1084.16 0, 3 1976 1086.36 0
     7783: 0 2295 1261.74 0, 1 2192 1205.11 0, 2 2114 1162.23 0, 3 2127 1169.38 0
     8286: 0 2448 1345.86 0, 1 2348 1290.88 0, 2 2255 1239.75 0, 3 2279 1252.95 0
     8790: 0 2603 1431.07 0, 1 2514 1382.14 0, 2 2400 1319.47 0, 3 2430 1335.96 0
     9293: 0 2755 1514.64 0, 1 2671 1468.46 0, 2 2540 1396.44 0, 3 2577 1416.78 0
     9796: 0 2905 1597.11 0, 1 2828 1554.77 0, 2 2681 1473.96 0, 3 2729 1500.35 0
     10299: 0 3060 1682.32 0, 1 2986 1641.64 0, 2 2821 1550.93 0, 3 2880 1583.36 0
     10802: 0 3209 1764.24 0, 1 3148 1730.70 0, 2 2964 1629.54 0, 3 3031 1666.38 0
     11305: 0 3363 1848.91 0, 1 3312 1820.87 0, 2 3107 1708.16 0, 3 3180 1748.30 0
     11809: 0 3516 1933.02 0, 1 3474 1909.93 0, 2 3253 1788.43 0, 3 3330 1830.76 0
     12312: 0 3670 2017.69 0, 1 3638 2000.10 0, 2 3396 1867.05 0, 3 3478 1912.13 0
     12815: 0 3827 2104.00 0, 1 3796 2086.96 0, 2 3539 1945.67 0, 3 3629 1995.15 0
     13318: 0 3978 2187.02 0, 1 3959 2176.57 0, 2 3682 2024.29 0, 3 3784 2080.36 0
     13821: 0 4131 2271.14 0, 1 4127 2268.94 0, 2 3826 2103.45 0, 3 3932 2161.73 0
     14325: 0 4284 2355.25 0, 1 4295 2361.30 0, 2 3971 2183.17 0, 3 4086 2246.40 0
     14828: 0 4436 2438.82 0, 1 4458 2450.91 0, 2 4118 2263.99 0, 3 4238 2329.96 0
     15331: 0 4590 2523.48 0, 1 4624 2542.18 0, 2 4260 2342.06 0, 3 4389 2412.98 0
     15834: 0 4738 2604.85 0, 1 4789 2632.89 0, 2 4406 2422.33 0, 3 4543 2497.65 0
     16337: 0 4872 2678.52 0, 1 4940 2715.91 0, 2 4528 2489.40 0, 3 4682 2574.06 0
     16840: 0 4910 2699.41 0, 1 5006 2752.19 0, 2 4555 2504.24 0, 3 4744 2608.15 0
     17343: 0 4927 2708.76 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4771 2622.99 0
     17846: 0 4944 2718.11 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     18349: 0 4962 2728.00 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     18852: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     19355: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     19858: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     20361: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     20864: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     21367: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     21870: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     22373: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     22876: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     23379: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     23883: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     24386: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     24889: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     25392: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     25895: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     26399: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     26902: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     27405: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     27908: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     28411: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     28914: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     29417: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     29920: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     30423: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     30926: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     31429: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     31932: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     32435: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     32939: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     33442: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     33945: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     34448: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     34951: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     35454: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     35958: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     36461: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     36964: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     37467: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     37970: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     38474: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     38977: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     39480: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     39983: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     40486: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     40989: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     41492: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     41995: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     42498: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     43001: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     43504: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     44007: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
     44510: 0 4970 2732.40 0, 1 5015 2757.14 0, 2 4555 2504.24 0, 3 4781 2628.49 0
    ich weiss jetzt noch nicht genau was was ist, entspricht das in etwa dem, was herauskommen sollte?
    gruß inka

  5. #35
    Benutzer Stammmitglied
    Registriert seit
    19.05.2015
    Beiträge
    69
    Hallo inka,

    ja das entspricht dem was herauskommen sollte, mit einer Ausnahme,dazu gleich.

    Die werte bedeuten folgendes:
    Code:
    zeit: motor_idx ticks abgerollter_umfang ticks/milli, das gleiche mit dem nächsten motor usw
    Die Ausnahme ist die letzte Schleife
    Code:
          for(uint8_t idx; idx < M_MAX; idx++)
            out_s += all_ticks_tmp[idx]; out_s += " ";
    
          Serial.print(out_s);
    
          log_time = wtime + millis();
    die muß natürlich 'idx' initialisieren:
    Code:
          //                hier
          //                  |
          //                  v
          for(uint8_t idx = M_VL; idx < M_MAX; idx++)
            out_s += all_ticks_tmp[idx]; out_s += " ";
    
           // und 
           out_s += "\n";
    
          Serial.print(out_s);
    
          log_time = wtime + millis();
    Der ganze Abschnitt dauert überings etwas über 2ms, wie man an den Zeitstempeln sehen kann.

    Gruß
    Chis

  6. #36
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    hallo allerseits,

    das fahrzeug hat jetzt die endgültigen räder bekommen:
    Klicke auf die Grafik für eine größere Ansicht

Name:	car_mit_omni_wheels_kpl.jpg
Hits:	15
Größe:	60,5 KB
ID:	30963

    das anflanschen der räder an die getriebeachsen sieht so aus:
    Klicke auf die Grafik für eine größere Ansicht

Name:	omni_wheel_montage.jpg
Hits:	16
Größe:	27,1 KB
ID:	30964

    hier kann man die fahrweise sehen:


    https://youtu.be/UuRWhUiWCaY

    das im video gezeigte wird weder über irgendwelche sensoren, noch über die klicks der encoder gesteuert (kommt noch), es ist nur eine aneindander gereihte folge von einzelnen codeschnipseln für die eine oder andere fahrweise...
    Geändert von inka (13.12.2015 um 13:15 Uhr)
    gruß inka

  7. #37
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    56
    Beiträge
    2.209
    Na hoffentlich geht das mal gut- diese Räder an den Getriebewellchen.
    Wie sind denn diese Getriebe, taugen die was?

    Ansonsten: mit Encodern kann man mit dem Teil bestimmt ne Menge hübsche Sachen anstellen, dank den Allseitenrädern (muss ich auch mal irgendwann was mit machen) kann man das Teil sehr genau positionieren, oder?
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

  8. #38
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    Zitat Zitat von Rabenauge Beitrag anzeigen
    Na hoffentlich geht das mal gut- diese Räder an den Getriebewellchen.
    Wie sind denn diese Getriebe, taugen die was?
    - ach, so wild ist es nicht. Das Omniwheel wiegt nur ca. 100gramm und die welle macht einen durchaus stabilen eindruck, sieht nur so zerbrechlich aus ...

    - Es war gar nicht so easy ein omniwheel zu dem preis (ca 9€ / stück) und in der passenden größe etwas zu finden...

    - Die getriebe sind für meine bedürfnise ok, über die genauigkeit (ich meine reproduzierbarkeit beim hin- und zurückfahren, also getriebespiel) kann ich nicht viel sagen, die übersetzung (1:48 ) hätte durchaus noch ein bischen größer sein können, so ist's entweder ein bischen zu schnell, oder nicht kräftig genug um die räder noch durchzudrehen, je nach dem was ich bei PWM einstelle. Das scheint auch ein problem beim "querfahren" zu sein, - das geht in der jetzigen konstellation (motor/getriebe/rad) nicht. Aber mit dem "auf der stelle drehen" bin ich durchaus zufrieden

    Zitat Zitat von Rabenauge Beitrag anzeigen
    Ansonsten: mit Encodern kann man mit dem Teil bestimmt ne Menge hübsche Sachen anstellen, dank den Allseitenrädern (muss ich auch mal irgendwann was mit machen) kann man das Teil sehr genau positionieren, oder?
    da bin ich noch am rumprobieren...
    gruß inka

  9. #39
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    hallo allerseits,

    mein künftiges roboter-fahrgestell war mir mit den DC-motoren und getriebe zu schnell, mit hilfe von PWM ließ sich das zwar verlangsamen, der antrieb wurde dadurch aber schwächer....

    Der nächste versuch findet mit schrittnotoren statt ( DC 5V 28YBJ-48 )

    Klicke auf die Grafik für eine größere Ansicht

Name:	IMG_8789-1.jpg
Hits:	13
Größe:	28,0 KB
ID:	31028Klicke auf die Grafik für eine größere Ansicht

Name:	IMG_8815-1.jpg
Hits:	14
Größe:	57,5 KB
ID:	31029

    angepasstes beispiel aus der CustomStepper lib (als demosoftware für das video):
    Code:
    #include <CustomStepper.h>
    
    
    CustomStepper stepper_VL(22, 24, 26, 28);
    CustomStepper stepper_HL(23, 25, 27, 29);
    CustomStepper stepper_HR(47, 49, 51, 53);
    CustomStepper stepper_VR(46, 48, 50, 52);
    
    
    boolean rotate_li;
    boolean rotate_deg_li;
    boolean rotate_re;
    boolean rotate_deg_re;
    boolean vorwaerts;
    boolean rueckwaerts;
    
    void setup()
    {
    
      rotate_li = false;
      rotate_deg_li = false;
      rotate_re = false;
      rotate_deg_re = false;
      vorwaerts = false;
      rueckwaerts = false;
    
    Serial1.begin(115200);
    
    }
    
    void loop()
    {
    
      if (stepper_VL.isDone() &&  rueckwaerts == false)
      {
        alle_stepper_rueckwaerts();
    
      }
    
      if (stepper_VL.isDone() &&  rueckwaerts == true && rotate_li == false)
      {
        rotieren_links();
      }
    
      if (stepper_VL.isDone() &&  rotate_li == true && vorwaerts == false)
      {
        alle_stepper_vorwaerts();
    
      }
    
      if (stepper_VL.isDone() &&  vorwaerts == true && rotate_re == false)
      {
        rotieren_rechts();
      }
    
      if (stepper_VL.isDone() &&  rotate_re == true && vorwaerts == true)
      {
        alle_stepper_vorwaerts();
      }
    
      stepper_VL.run();
      stepper_HL.run();
      stepper_HR.run();
      stepper_VR.run();
    
    }
    
    /***********************************************************/
    
    void alle_stepper_vorwaerts()
    {
      stepper_VL.setRPM(12);
      stepper_HL.setRPM(12);
      stepper_HR.setRPM(12);
      stepper_VR.setRPM(12);
    
      stepper_VL.setSPR(4075.7728395);
      stepper_HL.setSPR(4075.7728395);
      stepper_HR.setSPR(4075.7728395);
      stepper_VR.setSPR(4075.7728395);
    
      stepper_VL.setDirection(CW);
      stepper_VL.rotate(2);
      stepper_HL.setDirection(CW);
      stepper_HL.rotate(2);
      stepper_HR.setDirection(CW);
      stepper_HR.rotate(2);
      stepper_VR.setDirection(CW);
      stepper_VR.rotate(2);
      vorwaerts = true;
    }
    
    void alle_stepper_rueckwaerts()
    {
      stepper_VL.setRPM(12);
      stepper_HL.setRPM(12);
      stepper_HR.setRPM(12);
      stepper_VR.setRPM(12);
    
      stepper_VL.setSPR(4075.7728395);
      stepper_HL.setSPR(4075.7728395);
      stepper_HR.setSPR(4075.7728395);
      stepper_VR.setSPR(4075.7728395);
    
      stepper_VL.setDirection(CCW);
      stepper_VL.rotate(2);
      stepper_HL.setDirection(CCW);
      stepper_HL.rotate(2);
      stepper_HR.setDirection(CCW);
      stepper_HR.rotate(2);
      stepper_VR.setDirection(CCW);
      stepper_VR.rotate(2);
      rueckwaerts = true;
    }
    
    void rotieren_links()
    {
      stepper_VL.setRPM(12);
      stepper_HL.setRPM(12);
      stepper_HR.setRPM(12);
      stepper_VR.setRPM(12);
    
      stepper_VL.setSPR(4075.7728395);
      stepper_HL.setSPR(4075.7728395);
      stepper_HR.setSPR(4075.7728395);
      stepper_VR.setSPR(4075.7728395);
    
      stepper_VL.setDirection(CCW);
      stepper_VL.rotate(2);
      stepper_HL.setDirection(CCW);
      stepper_HL.rotate(2);
      stepper_HR.setDirection(CW);
      stepper_HR.rotate(2);
      stepper_VR.setDirection(CW);
      stepper_VR.rotate(2);
      rotate_li = true;
    }
    
    
    void rotieren_rechts()
    {
      stepper_VL.setRPM(12);
      stepper_HL.setRPM(12);
      stepper_HR.setRPM(12);
      stepper_VR.setRPM(12);
    
      stepper_VL.setSPR(4075.7728395);
      stepper_HL.setSPR(4075.7728395);
      stepper_HR.setSPR(4075.7728395);
      stepper_VR.setSPR(4075.7728395);
    
      stepper_VL.setDirection(CW);
      stepper_VL.rotate(2);
      stepper_HL.setDirection(CW);
      stepper_HL.rotate(2);
      stepper_HR.setDirection(CCW);
      stepper_HR.rotate(2);
      stepper_VR.setDirection(CCW);
      stepper_VR.rotate(2);
      rotate_re = true;
    }
    es funktionirt ( video hier ), ich wäre mit dieser geschwindigkeit zufrieden, was mir nicht gelungen ist, ist die elegante lösung von botty hier nachzubauen (um das hier realisieren zu können):


    Code:
    // Stepper xyz...
      for (uint8_t idx = ST_VL; idx < ST_MAX; idx++) 
      {
     // die 4 Stepper mit den verschiedenen, aber doch irgendwie 4x den gleichen anweisungen, bzw. variablen/konstanten zu "versehen"...
      }

    muster für die DC-motoren (AF_Motor lib)

    Code:
    enum motoren_e
    {
      M_VL = 0,   // Motor vorne links
      M_HL,
      M_VR,
      M_HR,
      M_MAX
    };
    
    struct motor
    {
      AF_DCMotor mot;
      uint8_t enc_pin;
      // volatile damit der Compiler keine 'dummen' Optimierung macht.
      volatile uint32_t ticks;
    
      unsigned long start_time;
      unsigned long stop_time;
    };
    
    struct motor motoren[M_MAX] =
    {
      { AF_DCMotor(4), 18, 0, 0, 0 },//M_VL
      { AF_DCMotor(1), 19, 0, 0, 0 },//M_HL
      { AF_DCMotor(2), 21, 0, 0, 0 },//M_HR
      { AF_DCMotor(3), 20, 0, 0, 0 } //M_VR
    };
    mein versuch das nachzuempfinden:

    Code:
      enum stepper_e
      {
      ST_VL = 0,   // Motor vorne links
      ST_HL,
      ST_VR,
      ST_HR,
      ST_MAX
      };
    
    struct Stepper motoren[ST_MAX]=
    {
    {CustomStepper(4),22, 24, 26, 28},
    {CustomStepper(1),23, 25, 27, 29},
    {CustomStepper(2),47, 49, 51, 53},
    {CustomStepper(3),46, 48, 50, 52}
    }
    wird vom compiler mit verschiedenen fehlermeldungen (bei verschiedenen kombinationen des aufbaus beim "stepper_motoren" struct) quittiert...
    --------------------------------------
    Was ich herausgefunden habe ist, dass die AFMotor lib eine möglichkeit beinhaltet die motoren mit einer "nummer" zu versehen, das bietet die CustomStepper lib nicht. Daran liegt sicher ein teil meiner probleme, aber ist das alles? Bzw. wie muss die vorarbeit aussehen, um die for-schleife (idx) realisieren zu können?
    gruß inka

  10. #40
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Code:
    #include <CustomStepper.h>
    
    enum stepper_e { ST_VL, ST_HL, ST_VR, ST_HR, ST_MAX };
    
    CustomStepper motoren[ST_MAX]
    {
      CustomStepper(22, 24, 26, 28),
      CustomStepper(23, 25, 27, 29),
      CustomStepper(47, 49, 51, 53),
      CustomStepper(46, 48, 50, 52)
    }

Seite 4 von 7 ErsteErste ... 23456 ... LetzteLetzte

Ähnliche Themen

  1. Vier PWM-Lüfter steuern
    Von Bammer im Forum AVR Hardwarethemen
    Antworten: 22
    Letzter Beitrag: 22.10.2010, 11:21
  2. Vier Servos steuern
    Von Brantiko im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 10
    Letzter Beitrag: 15.04.2008, 00:17
  3. Wie vier Motoren ansteuern???
    Von cinhcet im Forum Bauanleitungen, Schaltungen & Software nach RoboterNetz-Standard
    Antworten: 9
    Letzter Beitrag: 29.06.2006, 13:37
  4. vier L297 und VREF
    Von schmek im Forum Elektronik
    Antworten: 1
    Letzter Beitrag: 01.12.2005, 20:47
  5. Bot mit vier Rädern
    Von themaddin im Forum Mechanik
    Antworten: 17
    Letzter Beitrag: 06.11.2005, 22:39

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress