Show Posts
Pages: [1] 2 3
1  International / Deutsch / 3 Arduinus mittels i2c (wire.h) kommunikation untereinander spinnt??? on: May 24, 2011, 03:17:16 pm
Hallo liebe Leute. Ich möchte gern um einen Rat bitten...
Ich habe 3 Arduinos mit i2C verbunden. der erste sammelt ein paar Daten  und soll sie an die beiden anderen versenden. Kontinuierlich und Mehr nicht.
Vorbereitet habe ich es erstmal für einen wert der an beite gesendet werden soll, später sollen 2 verschiedene Potiwerte zu jeweils einen geschickt werden...
Nun jetzt versende ich die Packete mit (void requestInt()und bla bla) jedesmal wenn pakete angefordert werden (passiert ständig von beiden empfängern).

gekürztes Testprogramm schaut in etwa so aus Für den SENDER....
Code:
#include <Wire.h>

int byteSending = 1;
int toTransfer = 540; //540 weil das der initiale wert ist beim einschalten des Joysticks
int toTransfer_B = 1;
int Shift = toTransfer;
int mask = 0xFF;
unsigned char toSend = 540;



unsigned int Value_1 = 540;      // Ausgabe Varriable 10bit


//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
void setup()
{
 Wire.begin(2);                // i2c bus mit addresse 2 benutzen
 Wire.onRequest(requestInt);   // register event
 
}

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
void loop()
{
 
  //..bla bla  hier werden die daten gesammelt (Value_1 und Value_2 ist jetzt mal Y und X)
  //Value_1 = gesammelter wert.....;
  //Value_2 = gesammelter wert.....;
  //buttonProgramm_STATE = HIGH oder LOW...;
 ///////////////////////////////////////////////
 
    Value_1 = constrain (Value_1,10,1000);  // 10bit wert begränzen auf 10-1000
   
   
   
    toTransfer =   Value_1;
    toTransfer_B = buttonProgramm_STATE;
}   
/////############ Ende Loop ############////////////////

    void requestInt()
{
 
 //byteSending 1-4 sendet Value_1 zerhackt in 8bit packete)
 
  if (byteSending == 1) //sende packet 1 (Value 1)
  {
    toSend = Shift & mask;
    Shift = Shift >> 8;
    Wire.send(toSend);
    byteSending = 2;
  }
  else if (byteSending == 2) //sende packet 2
  {
    toSend = Shift & mask;
    Shift = Shift >> 8;
    Wire.send(toSend);
    byteSending = 3;
  }
  else if (byteSending == 3) //sende packet 3
  {
    toSend = Shift & mask;
    Shift = Shift >> 8;
    Wire.send(toSend);
    byteSending = 4;
  }
  else if (byteSending == 4) //sende packet 4
  {
    toSend = Shift & mask;
    Shift = Shift >> 8;
    Wire.send(toSend);
    byteSending = 5;
    Shift = toTransfer;
    mask = 0xFF;
    toSend = 0;
  }
 //byteSending 5 Sendet nur einen Schalterzusand (1 oder 0)
 
  else if (byteSending == 5) //sende packet 5 (Programmwahl)
  {
   Wire.send(toTransfer_B);
    byteSending = 1;
   // auf nächsten durchlauf vorbereiten
 
  }
}

Die Empfänger haben etwa soein Programm drauf....
Code:
#include <Wire.h>

int output = 0;
int output_B = 0;


float Value_2           = 540.00; 
int Betriebsmodus_State  = HIGH;


void setup()
{
 
    Wire.begin(4); //( die 4 hat empfänger A und die 3 hab ich Empfänger B gegeben)
}   
void loop()
{
   I2Cempfangen();
   
   // hier wird Value_2 verarbeitet
   // Betriebsmodus_State auch
}
/////####### Loop ende ######////////////



   void I2Cempfangen()
{
 
  Wire.requestFrom(2, 1);   // das erste byte  anfordern
  while(Wire.available())
  {
    unsigned char received = Wire.receive();
    output = received;
  }
 
  for (int i = 0 ; i < 3 ; i++) // nächsten 3 bytes
  {
     Wire.requestFrom(2, 1);   
     while(Wire.available())
     {
        unsigned char received = Wire.receive();
        output |= (received << 8);
     }
  }
 
 
  Wire.requestFrom(2, 1);   // und noch den Betriebsmodus_State anfordern
  while(Wire.available())
  {
    unsigned char received = Wire.receive();
    output_B = received;
  }

Value_2 = output ;
Betriebsmodus_State = output_B; 

 


}

Das Problem ist das wenn ich beide Empfänger mit dem Programm bespiele passiert nichts oder Müll ( zb werte sind nicht mehr von 10-1000 sondern 32000 bis kreuz und quer -32000..)
 Hat aber nur einer das programm drauf und der Andere hat nix drauf, funktioniert es...
Ich denke es hat mit dem Requesten zu tuhen, beide fordern ständig daten vom Sender an, ohne Timing oder so. Da kommt sicher der Interrupt von dem Sender durcheinander. Müsste irgend wie gesteuert werden das die Empfänger nacheinander einfach immer die werte erhalten sobald ein neuer verfügbar ist.
Giebt vieleicht noch eine andere "auslöser möglichkeit das Senden einzuleiten und abzustimmen....

Ich hoffe jemand versteht mein Problem...Würd mich sehr über eine Lösung freuen..

2  Forum 2005-2010 (read only) / Troubleshooting / Re: reading RC signal and timer affect unpleasant!! on: March 19, 2010, 04:22:49 am
http://de.nanotec.com/start.html is the right link...sorry..
3  Forum 2005-2010 (read only) / Troubleshooting / reading RC signal and timer affect unpleasant!! on: March 19, 2010, 04:21:54 am
hallo I have the arduino 2009 with ATmega328.
in my projekt i read the RC Signal (PWM)from my receiver. from this data I generate a frequenze between 0 - 15 kHz for a Steppercontroll (clock and Direction).
I read the time in millis() between High and High. on Pin 2.
then I make a lowpass filter to smoth the Result.
in next step i interpolate the range 0 to 500 to 1500 on left and 1500 on right in an "nonlinear shape."("Xsmoth" in my projekt)
then fast PWM port (9) to 65535,
and create an timeroverflow evry 65535 counts.
Xsmoth is the speed how fast the counter counts.on pin 9 I create a squarewave for my Steppercontroll (smc11 (www.nanotec.de))

It works fine but there are 2 problems.
first the reading of my RC Signal "jumps"somtimes to impossible values. bevore i use the timeroverflow it works fine.... maybe its a timing problem?

the second is, if I initialize the arduino or reset it at first i have a high frequence on pin 9 for a small moment. its not good because my stepper will turn some steps unintended.

can sombody help me please.
this is my code.....
Code:
/////////////////////////////////for the timer////////////////////////////////
float Xsmoth;                            //final smoothstepped value
int taktPin = 9;
void writetakt( uint8_t val ) {
  OCR1A = (val);
}
uint16_t phase = 0;
uint16_t speed = 0;
uint8_t sample = 0;

SIGNAL(TIMER1_OVF_vect){
  writetakt(sample);
  phase += speed;

  if(phase >= 32768)
  sample = 255;
  else
  sample = 0;
  if (Xsmoth < 1)
   sample = 0;
}
/////////////////////////////////reading PWM////////////////////////////////
int RCPin = 2;                                                               //input rc signal
int Motor_drehrichtung = 13;                                                // direction for steppercontroll
int timeX = 0;                                                             // rc signal
int timeX_old = 0;                                                        // old rc signal from last loop
int timeX_final = 0;                                                     // lowpassed RC Signal
int Zero_delay_timeLED = 250;                                           // zeropoint of Remotecontroll (not used)

long lastPulseX = 0;                                                  // last pulse in millis
long mstime = 0;                                                     // read time Millisecunden
long hptime = 0;                                                    //  read time Microsecunden

extern volatile unsigned long timer0_overflow_count;
unsigned long hpticks (void)
{
 return (timer0_overflow_count << 8) + TCNT0;
}

/////////////////////////////////non linear interpolation////////////////////////////////

#define SMOOTHSTEP( Xsmoth) (( Xsmoth) * ( Xsmoth) * (3 - 2 * ( Xsmoth)))
#define SMOOTHSTEP_plus( Xsmoth_plus) (( Xsmoth_plus) * ( Xsmoth_plus) * (3 - 2 * ( Xsmoth_plus)))

float TimeX_Min_Val_minus = 1500.0;            //Input Min Value ,hier wird die zu Interpolierende Range festgelegt
float TimeX_MAX_Val_minus = 0.0;              //Input Max Value, hier wird die zu Interpolierende Range festgelegt
float TimeX_Min_Val_plus = 0.0;              //Input Min Value ,hier wird die zu Interpolierende Range festgelegt
float TimeX_MAX_Val_plus = 1500.0;          //Input Max Value ,hier wird die zu Interpolierende Range festgelegt
float N = 250.0;  
float Nplus = 250.0;                      //limit input
float v;                                 //smoothstep expression variable


                                          
float Xsmoth_plus = (Xsmoth - 250);     //final smoothstepped value for left turning

/////////////////////////////////////

void setup() {
 Serial.begin(115200);                                      // Kommunikation PC

 pinMode (taktPin, OUTPUT);                                 / /Frequenze output
 pinMode(RCPin, INPUT);                                    //RC Pin as Input
 pinMode(Motor_drehrichtung, OUTPUT);                  //Direction Steppercontroll

 TCCR1A = _BV(WGM10) | _BV(COM1A1);
 TCCR1B = _BV(CS10) | _BV(WGM12);

 TIMSK1 |= _BV(TOIE1);

}
void loop() {

 if(millis() - lastPulseX >= 5)                               //read every 5 millis
 {
   while(!digitalRead(RCPin) == HIGH)                         //wait for next RC high
   {
     continue;
   }
   mstime = millis();
   hptime = hpticks();                                        //an recive RC Signal, record
   while(!digitalRead(RCPin) == LOW){
     continue;
   }
   mstime = millis();
   timeX = (hpticks()) - hptime - 220;                       //diference bitween is the result (my PWM)

////////////////////////////////////////Lowpass///////////////////////////////////////////////

   timeX_final = (0.1 * timeX) + (0.9 * timeX_old);       //10 percent from first value add to 90 percent from second value
  
  /////////////////////////////////// border from 0 to 500////////////////////////////////////////////////////////////////////////////
if (timeX_final > 500)                                  
   {timeX_final = 500;}

if (timeX_final < 0)
   {timeX_final = 0;}
///////////////////////////////////////value CW and CCW translation///////////////////////////////////////////////////////////////////
if (timeX_final < 250)
  {
    v = timeX_final / N;                                                            // Unterteilungen geteilt durch die nummer an schritten.
    v = SMOOTHSTEP(v);                                                             // Starten der smoothstep expression on v.
    Xsmoth = (TimeX_MAX_Val_minus * v) + (TimeX_Min_Val_minus * (1 - v));         // Lineare Interpolation Ausführen auf basis der zuvor gesetzten werte
   digitalWrite (Motor_drehrichtung,HIGH);
  }



if (timeX_final > 250)
  {
    v = (timeX_final - 250) / Nplus;                                                         // Unterteilungen geteilt durch die nummer an schritten.
    v = SMOOTHSTEP(v);                                                                      // Starten der smoothstep expression on v.
    Xsmoth = ((TimeX_MAX_Val_plus * v) + (TimeX_Min_Val_plus * (1 - v)));                  // Lineare Interpolation Ausführen auf basis der zuvor gesetzten werte
    digitalWrite (Motor_drehrichtung,LOW);
  }

////////////////////////////////////////////for next loop//////////////////////////////////////
 timeX_old = timeX_final;
 
 speed = Xsmoth;

 Serial.println(Xsmoth);  //PC out




///////////////////////////////////////////for next loop////////////////////////////////////////////////
   hptime = 0;
   lastPulseX = millis();
 }  

}

 
4  Forum 2005-2010 (read only) / Deutsch / Re: 16bit wert als 2 8bits senden und verbinden,RFM12 on: January 15, 2011, 03:13:39 pm
Hallo Uwe, schau mal bitte, ich hab jetz mal etwas zusammen geschrieben, was im grunde Funktioniert, ich habe nur ein problem (vermutlich mit dem addieren der bits  beim wieder zusammen setzen) Die Pakete werden gesendet, und auch empfangen und zugeordnet, allerdings ist irgendwo ein klitze Fehler.Wenn ich das Poti einlese bekomme ich nur 0 heraus, wenn ich den TEST_counter hochzählen lasse, funktioniert das ganze nur in 256er schritten, als würden die ersten 8 bit nicht anerkannt 0oder wären Nullen, weiß nicht. Kannst du mir vieleicht nochmal Helfen und mal kurz reinlesen..Lach bitte nich über meine Programmierweise ich weiß es nich anders....:-)

Die Sende Seite...
Code:
//SENDEN

#include <Ports.h>
#include <RF12.h>
#include <RF12sio.h>

int sensorPin = A0;  
unsigned int  Value1 = 0;

byte Send_A = 0;     //besteht aus 2 Header Bits (10) und den ersten 6 Datenbits von Value1
byte Send_B = 0;     //besteht aus 2 Header Bits (01) und den bits 7-12 von Value1
byte Send_C = 0;     //besteht aus 2 Header Bits (00) und den bits 13-16 und 4 Nullen von Value1

byte Send_X = 0;     // Wert zum Senden

int TEST_counter = 0;     //Testcounter

RF12 RF12;

void setup()
{
    Serial.begin(57600);
    rf12_config();
    rf12_easyInit(0);
}

void loop()
{
 //Value1 = analogRead(sensorPin);      // Poti einlesen /testcounter
   Value1 = TEST_counter;
   TEST_counter++;
 
 
 Send_A = Value1;         //8bit Sendepaket A und Header eintragen
 bitWrite(Send_A, 7, 0);
 bitWrite(Send_A, 8, 1);
 
 Send_B = Value1 >> 6;     //8bit Sendepaket B und Header eintragen
 bitWrite(Send_B, 7, 1);
 bitWrite(Send_B, 8, 0);

 Send_C = Value1 >> 12;     //8bit Sendepaket C und Header eintragen + nichtbenötigte bits werden 0
 bitWrite(Send_C, 5, 0);    
 bitWrite(Send_C, 6, 0);  
 bitWrite(Send_C, 7, 0);
 bitWrite(Send_C, 8, 0);





rf12_easyPoll();                     // RFM12 Pollen (wird benötigt)
     for (byte i = 0; i < 4; i++)     // 3 Sendepackete nacheinander Senden
         {
           if (i == 1)
               {Send_X =Send_A;
               Serial.println("A");
               }
           if (i == 2)
               {Send_X =Send_B;
                Serial.println("B");  
               }              
           if (i == 3)
               {Send_X =Send_C;
                Serial.println("C");  
               }              
        
               rf12_easySend(&Send_X, sizeof Send_X);  // und Senden!!
          
         }
}


und Die Empfänger Seite....
Code:
//EMPFANGEN



#include <Ports.h>
#include <RF12.h>
#include <RF12sio.h>


byte readarduino_8bit = 0;     // empfangener 8bit Wert
unsigned int Value_1 = 0;      // Ausgabe Varriable

byte LowBitV1 = 0;              // wert für ersten 8 bits von Value1
byte HighBitV1 = 0;             // wert für bit 9 bis 16 von Value1


byte Read_A = 0;              // 3 verschiedene empfangene Daten
byte Read_B = 0;
byte Read_C = 0;



RF12 RF12;    // wird irgendwie benötigt warum weiß ich nicht

void setup() {
    Serial.begin(57600);
    rf12_config();        // initialisieren von RFM12 ( wie mans voreingestellt hat(demo.PDE))
}

void loop()
{

    if (RF12.poll())                          //wenn RFM12 verfügbar ist...
        readarduino_8bit = RF12.read();      // lese das.....
  
  
    if ( bitRead(readarduino_8bit,8)==1)         //wenn bit 8 eine 1 ist kanns nur Read_A sein      
        {
         if ( bitRead(readarduino_8bit,7)==0)
              Read_A = readarduino_8bit;
        }
  
    if ( bitRead(readarduino_8bit,8)==0)         // weitere Paketidentifikation      
        {
         if ( bitRead(readarduino_8bit,7)==1)
              Read_B = readarduino_8bit;
         if ( bitRead(readarduino_8bit,7)==0)
              Read_C = readarduino_8bit;
        }

 bitWrite(Read_A, 8, 0);                             // den Header wieder mit nullen Füllen
 bitWrite(Read_B, 7, 0);
 bitWrite(Read_C, 5, 0);
 bitWrite(Read_C, 6, 0);

 LowBitV1 = (Read_B << 6) + Read_A;                 // die ersten 8 bits vom Value1 zusammen kleben
 HighBitV1 =(Read_B >> 2) + Read_C;                 // bit 9 bis 16 zusammenkleben
 
 Value_1 = word(HighBitV1,LowBitV1);                // beide 8bit werte zu 16bit wert zusammenbauen

 Serial.println(Value_1);                           // und siehe da da sollte unser gesendeter 16bit sein
    
}


viele Grüße Tobias
5  Forum 2005-2010 (read only) / Deutsch / Re: 16bit wert als 2 8bits senden und verbinden,RFM12 on: January 14, 2011, 09:53:23 am
Hätte noch eine andere Idee was vieleicht optimaler ablauft. und zwar Benötige ich ja nur 1024 werte also weit unter 32767 (was bedeutet ich benötige die 16 Bitstelle des Int wertes nicht. somit könnte ich 3x 5 bits übertragen wobei in jedem der 3 bits die vorderen 2 und das letzte als "marker dienen könnten. also ich könnte mir mittels bitshifting meine bits so schieben das ich die vorderen 2 und das letzte bit manuel "beschreibe" . somit könnte ich an der reciver seite nur die ersten 2 bits abfragen, somit weiss ich welcher teil der 3 pakete gerade ankommt. die abfrage des letzten bits (merke ich gerade) wäre irrelevant, brauch ich da nich..naja weiß nich ob ich mich jetzt bisschen vermorxt ausgedrückt hab, aber das könnte doch auch klappen, somit wären die daten auch schneller zur verfügung da ich weniger pakete senden müsste...Oder?
6  Forum 2005-2010 (read only) / Deutsch / Re: 16bit wert als 2 8bits senden und verbinden,RFM12 on: January 14, 2011, 06:47:35 am
Würden nicht 2 gleiche byte am Anfangen reichen? das wären ZB 2x 255. danach mein Hsb und Lsb und danach eine 0. Da ich nur 0-1024 werte benötige werden niemals das Hsb und das Lsb aus 2x255 bestehen.
Hab ich das so richtig verstanden? und die frage ist ja , in der Theorie klingt das ziehmlich gut, in der Praxis wüsste ich nicht wie ich das schreibe....bzw wie sage ich auf der empfänger seite: warte auf 2x 255 dann merke Hsb und darauf Lsb und wenn die 0 kommt, kann ich Hsb und Lsb zusammenfüren. Des Sender sendet im moment so oft es ihm Möglich ist, wenn der empfäner aber gerade ein paket vom RFM12 abhohlt und das nächste schon geschickt wird, verpasst er das ja, giebt es da irgend ein timing an das sich die beiden seiten halten, oder ist das irrelevant??
7  Forum 2005-2010 (read only) / Deutsch / 16bit wert als 2 8bits senden und verbinden,RFM12 on: January 14, 2011, 04:29:51 am
Hallo, Ich habe ein kleineres Problem, Ich habe eine Funkverbindung mit den RFM12 zwischen 2 Arduinos. einer sendet der andere empfängt. Das senden von 8 bit werten (ein Potivalue auf 0-255 gemappt) funktioniert sehr gut. Allerdings reicht mir  die auflösung nicht aus, Ich möchte gern den 16 Bit wert des Potis (0-1024) versenden. also müsste ich die 16bit zahl mittels lowByte(); und highByte(); ersteinmal aufsplitten, um sie auf der empfängerseite mit word(h,l) ; wieder zusammen zu fügen. Jetzt meine Frage...
Wie" markiere" ich die 2 Werte die ich nacheinander sende, das der empfänger mit der reihenfolge nicht durcheinander kommt?
Hier ist ein Link zur Bibliotheksreferenz der RFM12. sehe ich nicht so richtig durch.http://jeelabs.net/projects/cafe/wiki/RF12

das hier sind die funktionierenden .Pdes zum 8bit wert Senden...
Code:
//SENDEN

#include <Ports.h>
#include <RF12.h>
#include <RF12sio.h>

int sensorPin = A0;  
int sensorValue = 1;


RF12 RF12;

void setup() {
    Serial.begin(57600);
    rf12_config();
    rf12_easyInit(0);
}

void loop()
{
 rf12_easyPoll();
  
  sensorValue = analogRead(sensorPin);
  sensorValue = map( sensorValue,0,1024,0,255)

 
 rf12_easySend(&sensorValue, sizeof sensorValue);

 // Serial.println(sensorValue);
 }

Und die Empfänger seite:...
Code:
//EMPFANGEN



#include <Ports.h>
#include <RF12.h>
#include <RF12sio.h>

byte ReadA = 0;        // Header Signal

RF12 RF12;             // kein Plan kann evtl weg.

void setup() {
    Serial.begin(57600);
    rf12_config();  // RFM12 muss vorher zb. Mit der RFDemo.pde auf group 212 und ID 1 bzw2   gesetzt werden
}

void loop()
{
 if (RF12.poll())
    {
     ReadA = RF12.read();
     Serial.println(ReadA);
     delay(10);
     }      
}

Könnt Ihr mir bitte helfen einen 16 bit wert zu verschicken und im empfänger wieder sinnfoll zusammen zu bauen? Bekomme es nicht hin.....
8  Forum 2005-2010 (read only) / Deutsch / Re: RFM12-S  Und Arduino sendet nichts...??? on: January 10, 2011, 05:08:28 am
hallo Uwe ,naja schau mal hier http://jeelabs.org/2009/05/06/rfm12-vs-rfm12b-revisited/ der Pullup muss bei dem RF12 mit rein, bei dem RF12B nich. Mittlerweile sendet es auch etwas. allerdings im Beispielprojekt Crypt Send /Crypt RecV sende ich zb. das wort Hallo!, kommt aber nur irgend etwas Cryptisches eben an in etwa C3 34 G43 XXXXXX .... versteh ich nich warum da so ein Kauderwelch verschickt wird.  
Das Senden und empfangen funktioniert auf dem selben Weg, wenn sie Die Gleiche Gruppe und einer ID1 und der andere ID2 haben, funzt das. (theoretisch) einer sendet, und wenn der andere empfängt giebts ein Interupt Request das der andere Ardu daten abholen kann. So hab ichs zumindest verstanden. Möchte doch nur ein Value verschicken, das sich das so kompliziert gestaltet???
9  Forum 2005-2010 (read only) / Deutsch / Re: RFM12-S  Und Arduino sendet nichts...??? on: January 09, 2011, 04:22:22 pm
Hallo Die Bibliotheken einschließlich der Demo.pde gibts bei http://jeelabs.net/projects/cafe/wiki/RF12 kann sein das ports.h seperat geladen werden muss da sie benötigt wird und glaube nicht bit dabei ist. Die RFM 12 gibts bei http://www.pollin.de/shop/dt/OTI5OTgxOTk-/Bausaetze_Module/Module/Funkmodul_RFM12_Sende_Empfangsmodul.html

das Datenblatt ist http://pdf1.alldatasheet.com/datasheet-pdf/view/391035/HOPERF/RFM12.html

Naja Mittlerweile bin ich glaube ich ein stückchen weiter. Der RFM12 (nichtRFM12B!) benötigt einen Pullup wiederstand zwischen FSK/Data und 5V, sonst geht garnix. Des weirteren ist es auch Wichtig in zb der RF12Demo.pde oder in eben eigenen Programmen die Gruppe von standard 33 auf 212 zu setzen, keine Ahnung warum das in den Beispiele auf 33 Steht vermute wer einen RFM12-B hat(also den der mit 3,3V arbeitet) ist die Gruppe zulässig der 5V RFM12 kann nur in einer Sendegruppe Senden nämlich eben die 212.

Naja nun habe ich in Der Demo zumindest einen wert geschickt (zb 15A zurück kam ein OK und 192. Empfangs LEDs haben Geflimmert also ist da was passiert. nur eben nich so das was ich mir vorgestellt habe. Nun möchte Ich gerne wirklich einfach nur einen Messwert (10-1000) übermitteln ab besten mit jedem Loopdurchlauf. Ist das Machbar? stehen mir dafür überhaupt genügend Bit zur verfügung?. Ich werd aus den Beispielszenen nicht schlau zumal sie alle etwas anders aufgebaut sind, und im Hintergrund doch wohl etwas Komplexer arbeiten. im beispiel Crypt Send/recv  schickt es alle 3 Sec. einen Counter, durchblicke ich nur nicht, zb da wird der RFm so initialisiert  "rf12_initialize(1, RF12_868MHZ, 212);" in anderen Beispielen reicht wohl ein " rf12_config();" w ist die Config abgelegt? Fragen über Fragen ...Eigentlich brauche ich nur ein "Schick mir genau diesen Wert  zu dem anderen Arduino und zwar möglichst oft"....Da brauche ich wohl etwas Hilfe zumal ich mich noch vor zu tiefen Programmieren Scheue.
10  Forum 2005-2010 (read only) / Deutsch / RFM12-S  Und Arduino sendet nichts...??? on: January 08, 2011, 06:57:31 am
Hallo Leute, Ich hab mir 2 DC Boarduino und 2 RFM12 Transciever gegauft. Die Beiden möchte ich gern miteinander sprechen lassen, allerdings tut sich da nichts sorecht. Hab mir die Aktuelle RFM12 Library geladen,und alles was dazu gehört. verschiedene Sample Projekte getestet aber geht nicht vieleicht hab ichs falsch angeschlossen? oder muss ich nochwas mit der RFM12 Demo.pde einstellen (welche Gruppe und ID)... habe die RFM12 folgendermaßen verbunden... ( RFM12 --> Arduino) SEL --> D10 ; SCK --> D13 ; SDI --> D11 ; SDO --> D12 ; nIRQ --> D2 ; GND --> Gnd ; 5V --> 5V

Kann mir jemand einen Tipp geben wie ich feststelle ob es funktioniert und was ich vieleicht verkehrt mache? Möchte eigentlich nur gemessenen Poti wert so oft wie möglich von A nach B schicken..
11  Forum 2005-2010 (read only) / Deutsch / Re: Kompassmodul HMC6352 problemchen on: January 04, 2011, 12:18:20 pm
also das mit der Null hab ich genauso gemacht wie du es beschrieben hast, Ich hab erstmal den work around das ich zuvor eine Sehr hohe zahl addiere, dann berechne und später wiedr abziehe. sozusagen würde dann nach 9 umdrehungen einmal die nullstelle kommen, was in der praxis eher nie passieren wird....

Wegen den Beschleunigungs sensoren? hab ich keinen plan bis jetzt, der BMA180 klingt so erstmal ganz gut, aber woher weiß der sensor welchen winkelgrad er im moment schaut ohne referenz oder horizont?  und 2 sensoren miteinander  zu verknüpfen (sensor fusion) das wird bei mir nix. ich dachte es giebt da gleich ein modul was neigungs ausgleichenden kompass und drehwinkel messer onboard hat.. irgendsowas, den neigungskompensierten kompass kann ich ja auch seperat kaufen und verbauen, zusammen wäre aber schicker.
12  Forum 2005-2010 (read only) / Deutsch / Re: Kompassmodul HMC6352 problemchen on: January 04, 2011, 05:34:46 am
hm das wäre vieleicht die bessere lösung, im moment funktioniert es geade recht gut, der tiefpass hat allerdings noch einen für mich nützlichen vorteil, er glättet ja nicht nur sondern verzögert bei schnellen änderungen die werte,was von vorteil ist, ich möchte je eine recht sanfte start und stop phase haben. ich überlege nun welche sensor ich nun für die hoch runter bewegung nutzen sollte. ein Gyro der nicht wegdriftet,mit einem kompass der neigungsausgleich besitzt? kannst du da etwas empfehlen, inertialsensor(aber welcher) sollte nun auch nicht sooo teuer sein denke um die 150 müsste ich schon ausgeben oder.vieleicht tuts auch ein headtrecker oder copilotsystem...??
13  Forum 2005-2010 (read only) / Deutsch / Re: Kompassmodul HMC6352 problemchen on: January 04, 2011, 03:00:14 am
naja ich meinte damit die tiefpass funktion.
Da nehme ich ja (0,1*den aktuellen wert) + (0,9*alten wert). sobalb mein aktueller wert aber 0 und alter 1 ist das ergebnis im int wertebereich 0. bei 0 und 0 is auch null und bei -1 und 0 das selbe. erst bei -1 und -1 machts wieder sinn.

Die GPS Daten mitloggen wäre quatsch da das raster viel zu ungenau ist. ich möchte die ausrichtung im zusammenhang mit der zeit Loggen, von allen encodern, somit kann ich genau aufzeichnen zu welcher zeit ich welchen motor wie stark bewegt hab, und das zu jeder zeit wieder abspielen (Motion Controll)(geil wäre auch zeitscaliert). Die Daten können auch für ein 3D Cameratracking verwendet werden (wie zb Boujou, eine Software die ich auch auf arbeit nutze aus Videomaterial durch aufwendige berrechnung die exakte kamerabewegung im Raum nachzustellen,um gegebenenfalls Künstliche welten einzuarbeiten) ja und mit den Daten lässt sich das ganze extrem vereinfachen,oder untrackbare szene wie meeresoberflöche, person vor Bluescreen, Stürmisches Kornfeld,etc. einfachst bearbeiten.)

ja und deinen vorschlag die null einfach auszuradieren, glaube das klappt nicht bzw,hat letzten endes den gleichen effekt, oder vieleicht addiere ich vor dem tiefpass einfach sagen wir mal 32768, (unwahrscheinlich das ich 9 umdrehungen nach li oder re mache.) und ziehe sie danach einfach wieder ab?probier ich dann mal.
14  Forum 2005-2010 (read only) / Deutsch / Re: Kompassmodul HMC6352 problemchen on: January 03, 2011, 06:43:18 pm
Also erstmal ich habs jetzt endlich gelöst...ist eigentlich total Logisch,...knick in der Denkleitung....  so schaut jetzt das funktionierende Testprogramm aus
Code:
#include <Wire.h>
 
int compassAddress = 0x42 >> 1;  
int reading = 0;


float reading_before = 0;
float reading_B = 0;
float reading_C = 0;
float reading_old = 0;
int reading_glatt = 0;
 

boolean Firstrun = true;      // status für ersten durchlauf


void setup()
{
  Wire.begin();                
  Serial.begin(9600);          
}
  
void loop()
{
//***************************************************************************lese von Kompass
Wire.beginTransmission(compassAddress);
Wire.send('A');
Wire.endTransmission();
 
Wire.requestFrom(compassAddress, 2);
if(2 <= Wire.available())  
  {
    
    reading = Wire.receive();  
    reading = reading << 8;    
    reading += Wire.receive();      
    reading_B = reading;
//*************************************************************************** nur ein mal ausführen
  if (Firstrun == true)
   {
    reading_before = reading_B;
    Firstrun = false;
   }    
//***************************************************************************ansonsten wird die umrechnung ausgeführt
else
   {
       reading_C += (reading_B - reading_before);

       if   ((reading_B - reading_before)> 1800)
              reading_C -= 3600;

       if   ((reading_B - reading_before)< -1795)
              reading_C += 3600;
 //***************************************************************************Tiefpass glättet den gemessenen wert
      reading_glatt = ((reading_C*0.025) + (reading_old*0.975));
 //***************************************************************************wert für nächsten durchlauf übergeben    
      reading_before = reading_B;
      reading_old = reading_glatt;    
  
 
 
    Serial.println(reading_glatt);

  }
  }
  
  
  
                
}

zu deiner Frage wesshalb ich nicht den Encoder nehme..
 Ich habe eine Kamerakran gebaut der von Schrittmotoren und encoder betrieben, bereits mit einen Joystick gesteuert wird. Als Untergeordnete Steuermöglichkeit Möchte ich den Kompass in mein Handsteuerpult integrieren, um ggf. die Z achse des Remoteheads 1:1 mit der drehung des Steuerpultes realisieren. Zusätzlich soll ein weiterer Kompass am unbeweglichen Ende das Kamerakranes Angebracht sein, um die Radiale bewegung des Kranauslegers zu Kompensieren, sodas ohne ein zusätzliches eingreifen Die Kamera in der 0 position immer in die richtung schaut in der ich sie Genullt habe. Die Encoder sind für den Fall nur die Referenz, ich möchte mich ja an der Globalen Ausrichtung (Magnetfeld Erde) orientieren und nich der Lokalen, des Motors,die ist untergeordnet.. Außerdem ist der Encoder zum Datenloggen gedacht,er soll mir die Lokale ausrichtung angeben, desshalb kann ich den Encoder Counter nicht hineinpfuschen.... Habs sicher kompliziert erklärt...Wenn du noch eine idee für die Tiefpass misere hast,wie ich da um die "Flache" 0 herumkomme...
15  Forum 2005-2010 (read only) / Deutsch / Re: Kompassmodul HMC6352 problemchen on: January 03, 2011, 03:54:58 pm
OK jetzt ist hier doch noch ein Fehler im Konzept, Funktioniert doch nicht,(eigenartiger weise) Springt auch...Mist... da ist das Tiefpassproblem erstmal zweitrangig... funktioniert für die ersten 360 Grad umdrehung aber bei jeder weiteren sringts wieder an den entsprechenden stellen... Sorry für das hin und her.. ich weiss grad nich sorichtig weiter...
Pages: [1] 2 3