habs nochmals kontrolliert: beides, im serialmonitor wie auch in den beiden sketches ist auf 9600 eingestellt...
habs nochmals kontrolliert: beides, im serialmonitor wie auch in den beiden sketches ist auf 9600 eingestellt...
gruß inka
Hallo inka,
sorry diese WE ist bei mir volles Programm.
Ich habe das Ganze nochmal auf einen Motor und Encoder heruntergebrochen. Das Programm zeigt nach dem alles initialisiert ist im Wechsel "Regeln" und "andere Aktion" an. Wobei Letzteres mehrfach hintereinander vorkommen kann.
Wie Du sehen kannst wird die Ticker Variable dabei hochgezählt, ohne das Du Dich darum weiter kümmern mußt. Genau das ist das Praktische mit Interrupts, Aktionen laufen quasi paralel ab und Du kannst in Deiner loop Dich mit anderen Aktionen beschäftigen. Hoffe dieses Beispiel ist verständlicher als der andere uberfrachtete Sketch.
GrüßeCode:#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); }
Chris
Geändert von botty (14.11.2015 um 19:30 Uhr)
hi botty,
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:#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); }
da werden ja verschiedene ausgaben zu einem string "addiert" und dann als ganzes ausgedruckt. Beim einsatz dieser zeilen: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(); }
kommt aber etwas ähnliches im serial monitor wie das hier:Code:out_VL += " " + millis(); out_VL += " " + tmp_VL; out_VL += " "+ tmp_VL_ges; out_VL += " " + v; Serial.print (out_VL);
muss man vor dem addieren nicht die arten der ausgaben in eine gleiche art umwandeln?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���������
gruß inka
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
ob die letztere Variante als ordentlich gilt, kann ich hier gerade nicht probieren.Code:String out_s = String("Init"); // mindestens String other = String();
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
Ist zwar mehr Tipparbeit aber spart einem die Zeit beim Suchen wenn es mal nicht klappt.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()
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 12:00 Uhr)
hi,
ich habe jetzt die ausgabe routine so abgeändert:
das ist die ausgabe: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(); }
ich weiss jetzt noch nicht genau was was ist, entspricht das in etwa dem, was herauskommen sollte?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
gruß inka
Hallo inka,
ja das entspricht dem was herauskommen sollte, mit einer Ausnahme,dazu gleich.
Die werte bedeuten folgendes:
Die Ausnahme ist die letzte SchleifeCode:zeit: motor_idx ticks abgerollter_umfang ticks/milli, das gleiche mit dem nächsten motor usw
die muß natürlich 'idx' initialisieren: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();
Der ganze Abschnitt dauert überings etwas über 2ms, wie man an den Zeitstempeln sehen kann.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();
Gruß
Chis
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 )
angepasstes beispiel aus der CustomStepper lib (als demosoftware für das video):
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:#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; }
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)
mein versuch das nachzuempfinden: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 };
wird vom compiler mit verschiedenen fehlermeldungen (bei verschiedenen kombinationen des aufbaus beim "stepper_motoren" struct) quittiert...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} }
--------------------------------------
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
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) }
vielen dank erstmal für Deine zeit,
ist das jetzt so, dass die zuordnung der 4 Stepper durch die reihenfolge der einträge im "CustomStepper motoren[ST_MAX]" zu den laufenden nummer des enumerators zugeordnet werden? Und wie ist der zusammenhang zwischen stepper_e und motoren? Sind es nur beliebige bezeichnungen? Irgendwie fehlt mir hier doch noch der entscheidender impuls um da durchzublicken
und deshalb komme ich wohl auch nicht drauf wie das hier aussehen könnte:
Code:for (uint8_t idx = ST_VL; idx < ST_MAX; idx++) { CustomStepper stepper_e(idx) .run(); //oder CustomStepper(idx).run(); //oder CustomStepper motoren(idx).run() // oder CustomStepper(idx).run(idx) ... }
gruß inka
Das enum zählt nur Symbole auf, denen von 0 aufsteigend eine ganze Zahl zuordnet wird.
Ähnlich wie z.B.
#define ST_VL 0
#define ST_HL 1
etc.
Folgender Code erzeugt ein Feld mit Bezeichner "motoren"aus 4 Objekten vom Typ "CustomStepper":
Folgender Code iteriert durch dieses Feld und ruft in jedem Objekt die Methode "run" auf.Code:CustomStepper motoren[ST_MAX] { CustomStepper(22, 24, 26, 28), CustomStepper(23, 25, 27, 29), CustomStepper(47, 49, 51, 53), CustomStepper(46, 48, 50, 52) }
Code:for (uint8_t idx = ST_VL; idx < ST_MAX; idx++) { motoren[idx].run(); }
Lesezeichen