Forum: Mikrocontroller und Digitale Elektronik Arduino firmata ändern, kennt sich jemand aus?


von Hannes F. (pfannkuchen2001)


Lesenswert?

hi,

es ist das erste mal, dass ich arduino verwende und habe gleich ein 
Problem:

Ich möchte das board mit firefly (ein plugin für grasshopper/rhino) 
bedienen. Nun möchte ich einen ultraschall ping sensor verwenden und 
habe nun festgestellt, dass das nicht so einfach geht: ich habe in 
firefly nur ein modul "read" und eins "write". Unabhängig voneinander.

Ich kann also diesen sensor nicht mit firefly bedienen. das ganze 
funktioniert so, dass man mit der arduino.exe firmata auf das board 
schubst, um es dann mit firefly bedienen zu können.

Kann ich nun nicht den code von dem firmata so ändern, dass ich einen 
bestimmten pin nicht mehr in firefly nutzen kann, viel mehr wird der pin 
dann von firmata gleich verwendet und gibt dann die sensorergebnisse auf 
einem pin aus?

Und das ist das problem: mir fehlen die kenntnisse zu wissen, wie man 
daten auf einem pin ausgeben kann. High und low kann ich pins setzen, 
aber mehr auch nicht.

vielleicht zum besseren verständnis: das hier ist der code mit dem ich 
den sensor ansteuern kann:
1
const int pingPin = 7;
2
3
void setup() {
4
  // initialize serial communication:
5
  Serial.begin(9600);
6
}
7
8
void loop()
9
{
10
11
  long duration, inches, cm;
12
  pinMode(pingPin, OUTPUT);
13
  digitalWrite(pingPin, LOW);
14
  delayMicroseconds(2);
15
  digitalWrite(pingPin, HIGH);
16
  delayMicroseconds(5);
17
  digitalWrite(pingPin, LOW);
18
  pinMode(pingPin, INPUT);
19
  duration = pulseIn(pingPin, HIGH);
20
21
  inches = microsecondsToInches(duration);
22
  cm = microsecondsToCentimeters(duration);
23
  
24
  Serial.print(inches);
25
  Serial.print("in, ");
26
  Serial.print(cm);
27
  Serial.print("cm");
28
  Serial.println();
29
  
30
  delay(100);
31
}
32
33
long microsecondsToInches(long microseconds)
34
{
35
  return microseconds / 74 / 2;
36
}
37
38
long microsecondsToCentimeters(long microseconds)
39
{
40
41
  return microseconds / 29 / 2;
42
}

und das hier ist firmata:

http://pastebin.com/yrpw9PBP

meine idee war nun, diese beiden texte irgendwie zusammenzupacken, einen 
pin (pin 2) aus firmata komplett rauszulassen und einfach irgendwie dort 
den wert von dem sensor (oder auf einen anderen pin) zu setzen.


ist es einigermaßen verständlich, was ich machen will?! ;)

Ich würde mich über hilfe wirklich sehr freuen!


Danke schonmal!

von Hannes F. (pfannkuchen2001)


Lesenswert?

Es ist sozusagen genau das hier:

http://fireflylabs.squarespace.com/discussions/post/1699809 (2. post)

nur leider ist dieses file nicht mehr da und ich habe keine ahnung wie 
man das Programmieren kann!


Weis jemand weiter?



danke!

von 小鬼 (Gast)


Lesenswert?

Hannes F. schrieb:
> http://pastebin.com/yrpw9PBP

Was ist das für ein komischer Link? Woher weiss ich, was passiert, wenn 
ich da drauf klickt - ich trau mich nicht.
Ich mag nur Forumsanhänge, die auch ich ein paar Wochen noch da sind.

von Nick (Gast)


Lesenswert?

小鬼 schrieb:
> Was ist das für ein komischer Link?

Pastebin ist DIE Austauschplatform für Sourcecodes. Hättest du aber 
durch kurzes googlen selbst feststellen können.

>Woher weiss ich, was passiert, wenn
> ich da drauf klickt - ich trau mich nicht.

Paranoia?

von Karl H. (kbuchegg)


Lesenswert?

Nick schrieb:
> 小鬼 schrieb:
>> Was ist das für ein komischer Link?
>
> Pastebin ist DIE Austauschplatform für Sourcecodes. Hättest du aber
> durch kurzes googlen selbst feststellen können.

Mag sein.
Trotzdem erhebt sich die Frage: warum nicht hier posten?
Das Forum hat alle Einrichtungen dazu, ist überhaupt kein Problem.

>>Woher weiss ich, was passiert, wenn
>> ich da drauf klickt - ich trau mich nicht.
>
> Paranoia?

In meinem Fall ist es eher: ich will nicht.
Du fragst hier - dann poste auch hier.

von Hannes F. (pfannkuchen2001)


Angehängte Dateien:

Lesenswert?

Hallo, wie auch immer.

ich habe es jetzt geschafft, beide codeschnipsel zusammenzufügen und das 
ganze zum laufen zu bekommen: (anhang)

Wenn jemand verbesserungsvorschläge hat, immer raus mit der Sprache ;)

Danke!


PS.: ich habe grad ein Problem festgestellt: Wenn der Sensor keine daten 
bekommt (oder besser die Entfernung ausserhalb der reichweite ist, dann 
scheint es, als ob der komplette arduino verlangsamt wird... servos 
reagieren nicht mehr wirklich, alles stockt.
Wenn ich aber meine hand vor den sensor halte, dann funktioniert alles 
wunderbar. (also wenn der sensor wirkliche Messwerte ausspuckt.

mein code dafür ist das hier:
1
void entfernung(){
2
    pinMode(2, OUTPUT);
3
    digitalWrite(2, LOW);
4
    delay(2);
5
    digitalWrite(2, HIGH);
6
    delayMicroseconds(10);
7
    digitalWrite(2, LOW);
8
  
9
  
10
    pinMode(2, INPUT);
11
   duration = pulseIn(2, HIGH);
12
   //delay(100);
13
   cm = microsecondsToCentimeters(duration);
14
   
15
  }
16
  
17
long microsecondsToCentimeters(long microseconds)
18
{
19
  // speed of sound: 340 m/s or 29 microseconds/cm.
20
  // so: half of the distance
21
  return microseconds / 29 / 2;
22
}

und ich glaube das problem ist diese zeile:
"duration = pulseIn(2, HIGH);"

kann es sein, dass der controller da so lange wartet, bis er ein high 
signal bekommt - und dass dann in manchen fällen so lange dauert, dass 
der ganze ablauf gestört wird?

Kann ich das irgendwie abfangen? Oder kann ich das parallel ablaufen 
lassen? - zu allem anderen (serielle kommunikation zum beispiel...)


Grüße

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

1
> uint32_t parsedecimal(char *str){
2
>   uint32_t d = 0;
3
>   while (str[0] != 0) {
4
>     if ((str[0] > '50') || (str[0] < '0'))
1
     if ((str[0] > '9') || (str[0] < '0'))

'50' ist kein ASCII-Zeichen.
Das dieses parsedecimal mit negativen Zahlen nicht klar kommt, ist dir 
klar?

: Bearbeitet durch User
von Hannes F. (pfannkuchen2001)


Lesenswert?

Hmm und das heisst?
Den part habe ich hier her: http://fireflyexperiments.com/

Ich würde mich über eine idee für das im letzten Post beschriebene 
Problem freuen!


Danke!!!!

von Karl H. (kbuchegg)


Lesenswert?

Hannes F. schrieb:

> kann es sein, dass der controller da so lange wartet, bis er ein high
> signal bekommt


Was sagt die Doku zu pulsin?

Du musst dir angewöhnen, dass es Doku gibt und du da drinnen Dinge 
nachlesen kannst. Die Arduino Sachen haben den Vorteil, dass sie 
ausreichend gut dokumentiert sind. Du musst nur lesen.

von Karl H. (kbuchegg)


Lesenswert?

Hannes F. schrieb:
> Hmm und das heisst?
> Den part habe ich hier her: http://fireflyexperiments.com/
>
> Ich würde mich über eine idee für das im letzten Post beschriebene
> Problem freuen!

Den fix für ersteres hab ich gepostet.
Das andere war nur eine Frage. Wenn bei dir nie negative Zahlen 
auftauchen, dann ist es kein Problem. Dir muss nur klar sein, dass es 
bei negativen Zahlen ein Problem gibt und parsedecimal dann versagen 
wird.

von Hannes F. (pfannkuchen2001)


Lesenswert?

Hi,

danke für den tip zur doku...  http://arduino.cc/de/Reference/PulseIn
gefunden habe ich ein "timeout" was auch ziemlich gut seinen job macht. 
Nun habe ich aber das Problem, dass der sensor wahllos immerwieder 
nullen ausspuckt, wenn er nicht weis wie weit etwas entfernt ist.. das 
hat den effekt, dass servos, die damit gekoppelt sind die verrückt 
umherspringen....

Ideen?


Gruß

von Karl H. (kbuchegg)


Lesenswert?

Hannes F. schrieb:
> Hi,
>
> danke für den tip zur doku...  http://arduino.cc/de/Reference/PulseIn
> gefunden habe ich ein "timeout" was auch ziemlich gut seinen job macht.
> Nun habe ich aber das Problem, dass der sensor wahllos immerwieder
> nullen ausspuckt, wenn er nicht weis wie weit etwas entfernt ist.. das
> hat den effekt, dass servos, die damit gekoppelt sind die verrückt
> umherspringen....

Wie wärs, wenn du mit einem if den Messwert 'befragst' ob er 0 ist und 
dann entsprechend im Programm reagierst?
So was nennt man Programmieren. Du darfst gerne auch eigene Ideen 
einbringen und nicht nur vorgefertigte Funktionen miteinander verbinden.

: Bearbeitet durch User
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
Noch kein Account? Hier anmelden.