Arduino firmata ändern, kennt sich jemand aus?

OP #3391363
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!
#3391425
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.
OP #3392560
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
Angehängte Dateien:
#3392601
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.
OP #3392628
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ß
#3392637
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren