arduinorclib

Hallo,

arbeitet jemand von euch mit der oben genannten Lib? Habe hier ein paar Themen, bei denen ich nicht weiter kommen. Über einen Gedankenaustausch würde ich mich freuen.

Die Lib findet man unter: ArduinoRCLib / Wiki / Home

Danke schon mal
Paule

Was ist die arduinorclib?
Paule gib uns ein bißchen Infos und erklär uns die Themen die Dir Probleme machen.
Grüße Uwe

Hallo Uwe,

bei der RCLib handelt es sich um eine Lib, die spezielle für den RemoteControl (RC) Bereich entwickelt wurde. Sie enthält eine Sammlung von Funktionen, mit der am PMW, PPM Signale etc. analysieren und erstellen kann. Alles in allem eine wunderbare Sachen, aber...

ich habe Probleme mit einer Funktion. Die Funktion PPMout (erzeugen eines Summensignals) ist "hardcoded" auf Pin 9 oder 10 festgelegt. Ich wollte die Lib so ändern, das man den Pin während des Setup frei wählen kann.

Bisher sah das so aus:

// start PPMOut, use pin 9 (use false to use pin 10 as output)
	g_PPMOut.start(true);

Ich wollte es so haben:

g_PPMOut.start(3);

Aber irgendwie bekomme ich das nicht hin. Gerne kann ich mal den Code hier posten. Aber ich denke, wenn das niemand im Einsatz hat, bringt es nix..

Pin 9 und 10 sind mit Timer 1 verbunden, dem einzigen 16-bit Timer des ATmega328. Deshalb glaube ich kannst Du keinen anderen Timer bzw andere Pins verwendern.
Grüße Uwe

Das erklärt natürlich einiges. Ich muss mir an dieser Stelle wohl eingestehen, das ich noch extrem viele Lücken im Bezug auf das Arduino habe.

hier geht es um die Interrupts. Ich habe hier ein Beispielprogramm, das wie folgt aussieht:

/* ---------------------------------------------------------------------------
** This software is in the public domain, furnished "as is", without technical
** support, and with no warranty, express or implied, as to its usefulness for
** any purpose.
**
** servoin_example.pde
** Demonstrate Servo Signal Input functionality
**
** Author: Daniel van den Ouden
** Project: ArduinoRCLib
** Website: http://sourceforge.net/p/arduinorclib/
** -------------------------------------------------------------------------*/

#include <ServoIn.h>
#include <Timer1.h>


#define SERVOS 4

uint16_t g_values[SERVOS];                    // output buffer for ServoIn
uint8_t  g_workIn[SERVOIN_WORK_SIZE(SERVOS)]; // we need to have a work buffer for the ServoIn class

rc::ServoIn g_ServoIn(g_values, g_workIn, SERVOS);

void setup()
{
	// Initialize timer1
	rc::Timer1::init();
	
	// We use pin 8-11 as Servo input pins
	pinMode(8, INPUT);
	pinMode(9, INPUT);
	pinMode(10, INPUT);
	pinMode(11, INPUT);
	
	// only allow pin change interrupts for PB0-3, digital pins 8-11.
	PCMSK0 = (1 << PCINT0) | (1 << PCINT1) | (1 << PCINT2) | (1 << PCINT3);
	
	// enable pin change interrupt 0
	PCICR = (1 << PCIE0);
	
	// start listening
	g_ServoIn.start();
}

void loop()
{
	// update incoming values
	g_ServoIn.update();
	
	// handle servo values here, stored in g_values
}


// Interrupt handling code below, this needs cleaning

static uint8_t lastB = 0;

// Pin change port 0 interrupt
ISR(PCINT0_vect)
{
	uint8_t newB = PINB;
	uint8_t chgB = newB ^ lastB; // bitwise XOR will set all bits that have changed
	lastB = newB;
	
	if (chgB)
	{
		if (chgB & _BV(0))
		{
			g_ServoIn.pinChanged(0, newB & _BV(0));
		}
		if (chgB & _BV(1))
		{
			g_ServoIn.pinChanged(1, newB & _BV(1));
		}
		if (chgB & _BV(2))
		{
			g_ServoIn.pinChanged(2, newB & _BV(2));
		}
		if (chgB & _BV(3))
		{
			g_ServoIn.pinChanged(3, newB & _BV(3));
		}
	}
}

Nun wollte ich aber die Pins für den Eingang auf die Pins: 3, 11,12 und 13 umlegen. Das dies andere Ports, bzw. IRQ-Services hat, habe ich den Code wie folgt geändert:

/* ---------------------------------------------------------------------------
** This software is in the public domain, furnished "as is", without technical
** support, and with no warranty, express or implied, as to its usefulness for
** any purpose.
**
** servoin_example.pde
** Demonstrate Servo Signal Input functionality
**
** Author: Daniel van den Ouden
** Project: ArduinoRCLib
** Website: http://sourceforge.net/p/arduinorclib/
** -------------------------------------------------------------------------*/

#include <ServoIn.h>
#include <Timer1.h>


#define SERVOS 4

uint16_t g_values[SERVOS];                    // output buffer for ServoIn
uint8_t  g_workIn[SERVOIN_WORK_SIZE(SERVOS)]; // we need to have a work buffer for the ServoIn class

rc::ServoIn g_ServoIn(g_values, g_workIn, SERVOS);

void setup()
{
	// Initialize timer1
	rc::Timer1::init();
	
        Serial.begin(9600);

	pinMode(3, INPUT);
	pinMode(11, INPUT);
	pinMode(12, INPUT);
	pinMode(13, INPUT);
	
	PCMSK0 = (1 << PCINT3) | (1 << PCINT4) | (1 << PCINT5); // IR für Pins 11, 12, 13
	PCMSK2 = (1 << PCINT19);  // IR for Pin 3

	// enable pin change interrupt
	PCICR = (1 << PCIE0);
        PCICR = (1 << PCIE1);
     
       	
	// start listening
	g_ServoIn.start();
}

void loop()
{
	// update incoming values
	g_ServoIn.update();
	
	// handle servo values here, stored in g_values
        for (int i = 0; i < SERVOS; i++) {
          Serial.print(" Kanal: ");
          Serial.print(i);
          Serial.print(" = ");
          Serial.print(g_values[i]);
        }
          Serial.println("   ");
}


// Interrupt handling code below, this needs cleaning

static uint8_t lastD = 0;

// Pin change port 0 interrupt
ISR(PCINT2_vect)
{
	uint8_t newD = PIND;
	uint8_t chgD = newD ^ lastD; // bitwise XOR will set all bits that have changed
	lastD = newD;
	
	if (chgD)
	{
		if (chgD & _BV(0))
		{
			g_ServoIn.pinChanged(0, newD & _BV(0));
		}
	}
}




static uint8_t lastB = 0;

// Pin change port 0 interrupt
ISR(PCINT0_vect)
{
	uint8_t newB = PINB;
	uint8_t chgB = newB ^ lastB; // bitwise XOR will set all bits that have changed
	lastB = newB;
	
	if (chgB)
	{
		if (chgB & _BV(0))
		{
			g_ServoIn.pinChanged(1, newB & _BV(0));
		}
		if (chgB & _BV(1))
		{
			g_ServoIn.pinChanged(2, newB & _BV(1));
		}
		if (chgB & _BV(2))
		{
			g_ServoIn.pinChanged(3, newB & _BV(2));
		}
		
	}
}

Aber irgendwie schlägt mein Vorhaben fehlt :frowning: Hat jemand einen Tipp für mich?

Ich konnte mir meine Frage selbst beantworten!

Wunderbaren Link zu dem Thema gefunden: http://www.kriwanek.de/arduino/grundlagen/183-mehrere-pin-change-interrupts-verwenden.html

Hallo Paule,

ich habe auch vor mit der arduinorclib zu arbeiten.
Ich möchte einen alten Sender mit der Software zum Schülersender umbauen.
Was hast du vor? Kann man das mit den libs machen?

Gruß Bernd

Hallo Bernd,

die RCLIB ist extrem flexibel. Da findest du die gängigen Methoden für den Umgang mit Servos bzw. den RC-Signalen.
Ich kann jetzt nicht genau erkennen, wie du den Sender umbauen möchtest, aber ich denke aufgrund der Flexibilität der LIB sollte das gehen.
Du kannst z.B. die Potts abgreifen und damit ein Summensignal generieren.. Jedoch benötigst du noch das Protokoll, das du verwenden möchtest.

Zu meinem Vorhaben: Hat was mit Loggin zu tun. Ich möchte mit dem Arduino ein paar Messwerte erfassen und diese entsprechend speichern.
Diese sollen via PPM Übertagen und ausgewertet werden. Dauert aber noch ein bisschen, bis das alles so läuft, wie ich es mir vorstelle.

Patrick

Hallo Patrick,

kommst du mit dem Beispielsketch PPM OUT zurecht?
Ich habe 4 Poitis angeschlossen und es werden auch Impulse erzeugt, aber auch regelmäsig Störimpulse, so dass das Signal für Fernsteuerzwecke unbrauchbar ist.

Hi,

ich habe gleich einem Empfänger angeschlossen, damit funktioniert es ohne Probleme.
Habe damit zum Test auf einem Arduino Board über den Empfänger die Signale abgegriffen und über den SerialPort an ein zweites Arduino Board geleitet. Dort wurde das Summensignal wieder zerlegt und auf Servos ausgegeben.

Da hat nix gezuckt. Alle Befehle der Fernbedienung wurden gut umgesetzt.

Was mir aufgefallen ist: Es ist manchmal vorgekommen, das auf dem oben beschriebenen "Zweiten Board" ein Servo nicht gelaufen ist. Obwohl der Wert im Summensignal korrekt interpretiert worden ist und auch ausgegeben worden ist, hat der Servo nicht richtig funktioniert. Das konnte reporduzierbar nachgestellt werden, wobei das Fehlerbild immer das gleich war, der Servo aber wechselte !?!?

Da es nur ein Test war, habe ich das nicht weiter verfolgt.

Hat den jemand ein Ahnung, wie das PPM Signal aufgebaut wird? Ich habe mir ein Signal vom 900 ms mal auf dem Oszi angesehen und da konnte man fast nix sehen, also die Zeit des Signals war extrem klein (bis gar nicht vorhanden). Die Werte von 1500 ms bzw. 2000 ms. waren da wesentlich großer, also nicht nur doppelt oder dreifach so groß, sonder wesentlich WESENTLICH größer. Wird beim PPM Signal erst ab 900 gezählt? Ich brauch das zwar nicht, würde mich aber trotzdem mal interessieren.