Hallo, jetzt habe ich das Gyro mit dem Asuro verbunden und zwar so: Gyro Asuro --------------- VIN ==> 5V GND ==> GND SDA ==> Pin 28 SCL ==> Pin 27 jetzt soll ich ein Programm schreiben um Sensordaten(Gyroskop)auszutauschen zwischen 2 Asuros. Datenaustasch erfolgt via Bluetooth (BTM222) // Bluetooth ist schon auf Asuro montiert. Hat jemand vielleicht eine Idee? MfG
Danke zuerst für die Antwort, also 2 asuro tauschen Daten aus (Gyroskopdaten) Das Kommunizieren soll via Bluetooth erfolgen.
frankfurter fra schrieb: > jetzt soll ich ein Programm schreiben um [...] frankfurter fra schrieb: > Hat jemand vielleicht eine Idee? Ich würde vorschlagen: du schreibst ein Programm.
Silvan König schrieb: > frankfurter fra schrieb: >> jetzt soll ich ein Programm schreiben um > [...] > > frankfurter fra schrieb: >> Hat jemand vielleicht eine Idee? > > Ich würde vorschlagen: du schreibst ein Programm. Guter Vorschlag. Ich würde sogar noch detaillieren: * der eine sendet * der andere empfängt Ne, im Ernst, frankfurter: Was erwartest du? Das dir hier jemand das Programm schreibt? Hast du denn schon mal eine Kommunikation gemacht? Wenn nein, dann man doch diesen Teil mal als erstes. Was in dieser Phase übertragen wird, ist ja völlig zweitrangig, Hauptsache es wird übertragen und am Empfänger kommt das an, was der Sender sendet. Und wenn das dann klappt, dann machst du Teilprojekt 2A: Das Auslesen der Gyrodaten. Denn nur dadurch, dass du den angeschlossen hast, lesen sich die Daten ja nicht von alleine aus. UNd wenn dann beide Teilprojekte klappen und du Erfahrung gesammelt hast, dann schreibst du Programm 3: Auslesen der Gyrodaten und Übertragen per Bluetooth.
Karl Heinz Buchegger schrieb: > Was erwartest du? > Das dir hier jemand das Programm schreibt? ich erwarte von niemandem was, ich sammle hier nur Erfahrungen und Ideen, mehr nichts... Karl Heinz Buchegger schrieb: > Hast du denn schon mal eine Kommunikation gemacht? Natürlich, die Kommunikation funktioniert schon zwischen den beiden. Das Auslesen der Gyrodaten muss ich noch erproben.
frankfurter fra schrieb: > Natürlich, die Kommunikation funktioniert schon zwischen den beiden. Was ist denn dann die Frage? Oliver
die Daten des Gyro sollen ausgelesen werden und via bluetooth übertragen, das ist die Frage jetzt..
frankfurter fra schrieb: > die Daten des Gyro sollen ausgelesen werden und via bluetooth > übertragen, das ist die Frage jetzt.. Na ja, aber der Bluetooth Teil funktioniert ja schon, wie du gesagt hast. D.h. die Frage ist "die Daten sollen ausgelesen werden". Und eigentlich ist das ja keine Frage sondern eine Aufgabenbeschreibung. Wie werden die Daten vom Gyro ausgelesen? Das wäre eine Frage! > Hat jemand vielleicht eine Idee? Aber sicher doch. Das Datenblatt zum Gyro besorgen und da drinn studieren, welche Möglickeiten für dieses Auslesen zur Verfügung stehen. (Lass dir doch nicht jeden Scheiss aus der Nase ziehen! Hier weiß kein Mensch, welchen Gyro du hast. Oder denkst du es gibt weltweit nur ein einziges MOdell?)
mein Gyro: L3G4200D Karl Heinz Buchegger schrieb: > Wie werden die Daten vom Gyro ausgelesen? genau das will ich wissen??
Stellt sich die nächste Frage, wie ist er Angschlossen? SPI I2C? Und wieder fehlen wichtige Angaben...
Ok sorry, steh ja ganz oben I2C. Dann stellt sich aber die Frage, hast du schon mal mit I2C gearbeite, also von Software seite?
Chris schrieb: > Ok sorry, steh ja ganz oben I2C. Dann stellt sich aber die Frage, hast > du schon mal mit I2C gearbeite, also von Software seite? nö leider noch nicht
Vom Fleury Peter gibt es einen I2C-Master Code. Gibts sicher auch von anderen, aber die ist die, die mir als erstes einfällt. http://homepage.hispeed.ch/peterfleury/avr-software.html Ansonsten: In der Codesammlung wird man mit dem Stichwort I2C sicher auch fündig.
frankfurter fra schrieb: > mein Gyro: L3G4200D Warum fragst Du eigentlich nicht von Anfang an mit Angabe der genauen Typenbezeichnung? Soweit ich das sehe, gibt es auf dieser Seite "Example Code" für dieses Gyro-Modul: https://www.sparkfun.com/products/10612 Der Code ist zwar wohl für Arduino, aber wenn Du Dir den Code ansiehst, dürfte eine Umsetzung auf die Asuro I2C-Library dann wohl möglich sein (kenne Asuro nicht, aber soweit ich gesehen habe, unterstützt diese Roboter-Library auch I2C). Falls Du bisher überhaupt noch nie auch nur irgendeinen billigeren I2C-Sensor programmiert hast, wäre es vielleicht auch keine schlechte Idee, Dir erstmal ein Programmbeispiel aus Deiner Asuro-Library für irgendeinen anderen direkt unterstüttzen I2C-Sensor genauer anzusehen, vielleicht einen einfachen Temperatursensor, um erst danach an die Code-Umsetzung für den neuen I2C-Gyrosensor zu gehen, wenn Du verstanden hast, wie die Asuro-I2C-Library generell funktioniert.
Danke für deine Antwort, ich habe jetzt zwei programme geschrieben ,allerdings ohne gyro und ich weiss nicht genau wie und was ich integrieren kann um die Daten vom Gyro auszulesen und zum andern Asuro zu senden ?? //Der Master-ASURO soll nach dem Einschalten einen Meter vor und zurückfahren und sendet ständig das Signal an den Slave-ASURO. Wenn der ASURO-Slave in der Nähe(im Piconetz) ist, dann kann er das Signal empfangen und dreht sich im Kreis. Sobald der Master ausgeht oder nicht mehr in Reichweite ist, stoppt der ASURO-Slave sich bewegen und macht nach zwei Sekunden macht er eine Halbkreis Drehung und bleibt dann Stehen. Der Programmablauf wiederholt sich wenn man den ASURO-Master wieder eingeschalte// Das Programmteil für den ASURO-Master:
1 | #include "asuro.h" |
2 | #include "myasuro.h" |
3 | void fahren ( |
4 | int distance, |
5 | int speed) |
6 | {
|
7 | unsigned long enc_count; |
8 | int tot_count = 0; |
9 | int diff = 0; |
10 | int l_speed = speed, r_speed = speed; |
11 | /* stop the motors until the direction is set */
|
12 | MotorSpeed (0, 0); |
13 | /* if distance is NOT zero, then take this value to go ... */
|
14 | if (distance != 0) |
15 | {
|
16 | /* calculate tics from mm */
|
17 | enc_count = abs (distance) * 10000L; |
18 | enc_count /= MY_GO_ENC_COUNT_VALUE; |
19 | if (distance < 0) |
20 | MotorDir (RWD, RWD); |
21 | else
|
22 | MotorDir (FWD, FWD); |
23 | }
|
24 | EncoderSet (0, 0); |
25 | /* now start the machine */
|
26 | MotorSpeed (l_speed, r_speed); |
27 | while (tot_count < enc_count) |
28 | {
|
29 | SerPrint("C\n\r"); |
30 | tot_count += encoder [LEFT]; |
31 | diff = encoder [LEFT] - encoder [RIGHT]; |
32 | if (diff > 0) |
33 | { /* Left faster than right */ |
34 | if ((l_speed > speed) || (r_speed > 244)) |
35 | l_speed -= 10; |
36 | else
|
37 | r_speed += 10; |
38 | }
|
39 | if (diff < 0) |
40 | { /* Right faster than left */ |
41 | if ((r_speed > speed) || (l_speed > 244)) |
42 | r_speed -= 10; |
43 | else
|
44 | l_speed += 10; |
45 | }
|
46 | /* reset encoder */
|
47 | EncoderSet (0, 0); |
48 | MotorSpeed (l_speed, r_speed); |
49 | Msleep (1); |
50 | }
|
51 | MotorDir (BREAK, BREAK); |
52 | }
|
53 | void fahren2 ( |
54 | int distance, |
55 | int speed) |
56 | {
|
57 | unsigned long enc_count; |
58 | int tot_count = 0; |
59 | int diff = 0; |
60 | int l_speed = speed, r_speed = speed; |
61 | /* stop the motors until the direction is set */
|
62 | MotorSpeed (0, 0); |
63 | /* if distance is NOT zero, then take this value to go ... */
|
64 | if (distance != 0) |
65 | {
|
66 | /* calculate tics from mm */
|
67 | enc_count = abs (distance) * 10000L; |
68 | enc_count /= MY_GO_ENC_COUNT_VALUE; |
69 | if (distance < 0) |
70 | MotorDir (RWD, RWD); |
71 | else
|
72 | MotorDir (FWD, FWD); |
73 | }
|
74 | /* ... else take the value degree for a turn */
|
75 | else
|
76 | {
|
77 | /* calculate tics from degree */
|
78 | enc_count = abs (degree) * MY_TURN_ENC_COUNT_VALUE; |
79 | enc_count /= 360L; |
80 | |
81 | if (degree < 0) |
82 | MotorDir (RWD, FWD); |
83 | else
|
84 | MotorDir (FWD, RWD); |
85 | }
|
86 | /* reset encoder */
|
87 | EncoderSet (0, 0); |
88 | /* now start the machine */
|
89 | MotorSpeed (l_speed, r_speed); |
90 | while (tot_count < enc_count) |
91 | {
|
92 | SerPrint("V\n\r"); |
93 | tot_count += encoder [LEFT]; |
94 | diff = encoder [LEFT] - encoder [RIGHT]; |
95 | |
96 | if (diff > 0) |
97 | { /* Left faster than right */ |
98 | if ((l_speed > speed) || (r_speed > 244)) |
99 | l_speed -= 10; |
100 | else
|
101 | r_speed += 10; |
102 | }
|
103 | if (diff < 0) |
104 | { /* Right faster than left */ |
105 | if ((r_speed > speed) || (l_speed > 244)) |
106 | r_speed -= 10; |
107 | else
|
108 | l_speed += 10; |
109 | }
|
110 | /* reset encoder */
|
111 | EncoderSet (0, 0); |
112 | MotorSpeed (l_speed, r_speed); |
113 | Msleep (1); |
114 | }
|
115 | MotorDir (BREAK, BREAK); |
116 | }
|
117 | int main (void) |
118 | {
|
119 | Init(); |
120 | EncoderInit(); |
121 | unsigned char senden, abfang; |
122 | unsigned char taste, taste2; |
123 | int i = 0; |
124 | senden = 0; // sende-Variable auf null setzen |
125 | while(1) { |
126 | fahren(1000,0,180); |
127 | fahren2(-1000,0,180); |
128 | Msleep(200); |
129 | }
|
130 | return 0; |
131 | }
|
Das Programm für den ASURO -Slave:
1 | #include "asuro.h" |
2 | #include "myasuro.h" |
3 | void rechts ( |
4 | int distance, |
5 | int degree, |
6 | int speed) |
7 | {
|
8 | unsigned long enc_count; |
9 | int tot_count = 0; |
10 | int diff = 0; |
11 | int l_speed = speed, r_speed = speed; |
12 | /* stop the motors until the direction is set */
|
13 | MotorSpeed (0, 0); |
14 | /* if distance is NOT zero, then take this value to go ... */
|
15 | if (distance != 0) |
16 | {
|
17 | /* calculate tics from mm */
|
18 | enc_count = abs (distance) * 10000L; |
19 | enc_count /= MY_GO_ENC_COUNT_VALUE; |
20 | |
21 | if (distance < 0) |
22 | MotorDir (RWD, RWD); |
23 | else
|
24 | MotorDir (FWD, FWD); |
25 | }
|
26 | /* ... else take the value degree for a turn */
|
27 | else
|
28 | {
|
29 | /* calculate tics from degree */
|
30 | enc_count = abs (degree) * MY_TURN_ENC_COUNT_VALUE; |
31 | enc_count /= 360L; |
32 | |
33 | if (degree < 0) |
34 | MotorDir (RWD, FWD); |
35 | else
|
36 | MotorDir (FWD, RWD); |
37 | }
|
38 | /* reset encoder */
|
39 | EncoderSet (0, 0); |
40 | /* now start the machine */
|
41 | MotorSpeed (l_speed, r_speed); |
42 | while (tot_count < enc_count) |
43 | {
|
44 | tot_count += encoder [LEFT]; |
45 | diff = encoder [LEFT] - encoder [RIGHT]; |
46 | if (diff > 0) |
47 | { /* Left faster than right */ |
48 | if ((l_speed > speed) || (r_speed > 244)) |
49 | l_speed -= 10; |
50 | else
|
51 | r_speed += 10; |
52 | }
|
53 | if (diff < 0) |
54 | { /* Right faster than left */ |
55 | if ((r_speed > speed) || (l_speed > 244)) |
56 | r_speed -= 10; |
57 | else
|
58 | l_speed += 10; |
59 | }
|
60 | /* reset encoder */
|
61 | EncoderSet (0, 0); |
62 | MotorSpeed (l_speed, r_speed); |
63 | //Msleep (1);
|
64 | }
|
65 | }
|
66 | |
67 | int main (void) |
68 | {
|
69 | Init(); |
70 | EncoderInit(); |
71 | unsigned char senden; |
72 | while(1) |
73 | {
|
74 | SerRead(&senden, 1,0); // ein Zeichen empfangen |
75 | |
76 | if(senden == 'C'){ |
77 | GoTurn(0,360,150); |
78 | BackLED(ON,ON); |
79 | }
|
80 | else if(senden == 'V'){ |
81 | GoTurn(0,-360,150); |
82 | BackLED(OFF,OFF); |
83 | StatusLED(YELLOW); |
84 | }
|
85 | }
|
86 | return 0; |
87 | }
|
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.