RC Model Zender=> ontvanger puls meter ( NOKIA Display + Nan

Toon hier Uw afgeronde projecten aan anderen.
Berichten: 17
Geregistreerd: 06 Feb 2013, 19:30

RC Model Zender=> ontvanger puls meter ( NOKIA Display + Nan

Berichtdoor retlawrobbe » 19 Jan 2016, 17:45

RC Model Zender=> ontvanger puls meter ( NOKIA Display + Nano )

Op vraag van een "Model vliegtuig" clublid of het mogelijk is om de pulslengte van een RC model ontvanger
( of de uitgangen van een multicopter stuur bord ) te meten en zichtbaar te maken op een display, het NOKIA
display is gesloopt uit een oude GSM, is volgend programma uit de bus gekomen.

Het programma kan 8 PPM ( Pulse Position Modulation ) kanalen ( positief signaal ) inlezen van een ontvanger ( of multicopter bord )
via de Arduino NANO digitale inputs, ook de trainer uitgang van een RC zender of een RC ontvanger met Common/Single PPM,
waar een positief Common/Single PPM signaal uitkomt kan gemeten worden via de Arduino D2 ( interrupt).

De signalen kleiner dan 935 msec en groter dan 2120 msec worden genegeerd. b.v. Futaba signalen.
Het midden is op 1500 msec.

Inlezen van de PPM signalen Inlezen van de C(common)-PPM signalen
ook genoemd Single PPM
Kanaal Arduino input Kanaal Arduino input
1 D2 C-PPM D2 ( interrupt)
2 D3
3 D4
4 D5
5 D6
6 D7
7 D10
8 D12

Voor het display worden de volgende digitale oututs gebruikt :
Nokia display Arduino output
RESET D8
C(hip)S(elect) D9
SDATA D11
SCK(clock) D13
3,3V 3,3V Output

Het programma detecteerd of er een PPM of een C-PPM signaal aanwezig is op de Arduino input D2, daarom
is het aan te raden om minstens D2 aangesloten te hebben voor zowel PPM of C-PPM meting, de andere
ingangen kunnen aangesloten worden naargelang uw wensen.

Als toemaat wordt de spanning gemeten van de voeding ( 2 cell Lipo ) , welke er voor zorgt dat het NOKIA display ( LED ) goed zichtbaar wordt.
Indien de spanning kleiner dan 7,2 Volt is, wordt de voltage weergeven met witte cijfers op een zwarte ondergrond, boven 7,2 Volt is de weergave zwarte cijfers op een witte ondergrond.

De nodige 5V voor de Arduino kan eventueel geleverd worden door de RC zender, wanneer de externe voeding aangesloten wordt, MOET de positieve (+5V ) verbinding met de RC ontvanger worden verbroken.
De ontvanger kan ook aangesloten worden op 5V van de Arduino, MAAR dan mag er geen enkele belasting ( zoals bv servo's ) op de uitgangen van de RC ontvanger worden verbonden.

Opmerking : In de code is gebruik gemaakt van de NOKIAPHILLIPS library, deze is identiek met de library ColorLCDShield.



cpp code
/*
WITH LCD ON => 1650 dynamic mem with DEBUG OFF / 1887 with DEBUG ON
WITH LCD OFF => 52 dynamic mem with DEBUG OFF / 299 with DEBUG ON
*/
#include <floatToString.h>
//#include <ColorLCDShield.h>
#include <NOKIAPHILLIPS.h> // the same as ColorLCDShield.h

#define DEBUG 0 // set to 1 : to compilate all serial prints, = 0 for no Serial prints
#define LCD 1 // set to 1 : to compilate all LCD instructions, = 0 for no LCD instructions

#if LCD
LCDShield lcd;
#endif
char tchar[5]; // 16 used for sprintf()

#define nr_ch 8
#define min_ms 935
#define max_ms 2120
byte IN_OK[nr_ch]={0,0,0,0,0,0,0,0};
int IN_CH[nr_ch]; // table pulse width values
byte CH[nr_ch] = {2,3,4,5,6,7,10,12};
/* byte CH1 = 2; //INPUT Reads channel 1 from RX ( FUTABA AILE CH1 )
byte CH2 = 3; //INPUT Reads channel 2 from RX ( FUTABA ELEV CH2 )
byte CH3 = 4; //INPUT Reads channel 3 from RX ( FUTABA THROTTLE CH3 )
byte CH4 = 5; //INPUT Reads channel 4 from RX ( FUTABA RUDDER CH4 )
byte CH5 = 6; //INPUT Reads channel 5 from RX ( FUTABA GEAR CH5 )
*/

// text
char* CH_char = "CH";
char* NEG_POS = "- +";

//INTERRUPT PARAMETERS
int tim,prevtim,index=0;
boolean exe_inter = LOW;

void setup() {
#if DEBUG
Serial.begin(38400);//(74880);
#endif
// This should only be init(EPSON) or init(PHILLIPS)
#if LCD
lcd.init(PHILLIPS); //Initialize the LCD
lcd.contrast(80); // Sets LCD contrast, adjust this if your contrast is odd looking.
lcd.clear(WHITE); // Clear LCD to solid white
// delay(1000);
lcd.setRect(0, 0, 16, 132, 1, WHITE);
lcd.setStr(CH_char, 0, 2, BLACK, WHITE);
lcd.setStr("PPM", 0, 32, BLACK, WHITE);
lcd.setStr(CH_char, 0, 67, BLACK, WHITE);

lcd.setStr(NEG_POS, 14, 10, BLACK, WHITE);
lcd.setStr(NEG_POS, 14, 78, BLACK, WHITE);
#endif
for (byte i=0; i < nr_ch; i++){
pinMode(CH[i], INPUT);
}
attachInterrupt(digitalPinToInterrupt(CH[0]), Handle_Inter, RISING );
#if DEBUG
Serial.println("NOKIA_Receiver : 11/01/2016");
#endif
}

void loop() {
if (exe_inter == HIGH){
interrupts();
#if LCD
lcd.setStr("C", 0, 22, WHITE, BLACK);
#endif
}else{
#if LCD
lcd.setStr(" ", 0, 22, BLACK, WHITE);
#endif
noInterrupts();
exe_inter = LOW;
#if DEBUG
Serial.println("READ channels");
#endif

CH_read_PPM();
}

byte ll,cc=0;
for (byte i=0; i < nr_ch; i++){
if (i < 4 ) {
ll=28+i*24; cc=1;
}else{
ll=28+(i-4)*24; cc=67;
}
#if LCD
sprintf(tchar,"%0001d",i+1); lcd.setStr(tchar, ll, cc, BLACK, WHITE);
if ( IN_CH[i] < min_ms or IN_CH[i] > max_ms){
sprintf(tchar,":%0004d",IN_CH[i]); lcd.setStr(tchar, ll, cc+13, BLACK, RED);
}else{
sprintf(tchar,":%0004d",IN_CH[i]); lcd.setStr(tchar, ll, cc+13, BLACK, WHITE);
}

draw_line(ll+18,cc,IN_CH[i]); // Graphics are 18 Dots lower than text
IN_CH[i] = 0;
}

// Read and display the Power batery voltage
float ana =analogRead(A7);ana = ana/100; // first read in float & than divide
// float ana = (analogRead(A0)/100); gives when ana =745 => ana = ?.00
lcd.setRect(0, 84, 15, 130, 1, WHITE); lcd.setStr("V", 0, 120, BLACK, WHITE);
if ( ana > 7.2 ){
lcd.setStr(floatToString(tchar, ana, 1), 0, 86, BLACK, WHITE );
}else{
lcd.setStr(floatToString(tchar, ana, 1), 0, 86, WHITE, BLACK );
#endif
}
// delay(100);
}
//--------------------------------------------------------------------------------------
void Handle_Inter() { // Handle interrupts on D2
// if(digitalRead(CH[0]) == LOW ){


tim = micros();
int dif = tim - prevtim;
prevtim=tim;
if( dif > 5000){ // RESET PERIOD value => +/- 10000
index=0;
if (dif > 20000) {exe_inter = LOW;}
}else{
if ( dif > min_ms and dif < max_ms ){
IN_CH[index]= dif;
#if debug
Serial.print("INTERRUP DATA");
Serial.print(" CH"); Serial.print(index=1); Serial.print(": ");Serial.print(IN_CH[index]);
Serial.print("/"); Serial.println((IN_CH[index]-1090)/8);
#endif
}
index= index +1;
if(index > 8){index=0;}
}
#if DEBUG
Serial.println(dif);
#endif
// }
}
//--------------------------------------------------------------------------------------
void draw_line( byte lin,byte col, int IN_CH){
#define GR_tick 8 // Graphic BAR Tickness
#if LCD
if (IN_CH >min_ms and IN_CH <max_ms){
lcd.setRect(lin, col+1, lin+GR_tick, ((IN_CH-1058)/16)+col-1, 1, RED);
lcd.setRect(lin, col+((IN_CH-1058)/16), lin+GR_tick,col+54, 1, GREEN);

lcd.setRect(lin, col+28, lin+GR_tick, col+29, 1, BLACK);// BAR display vertical midline
}
lcd.setRect(lin, 0, lin+GR_tick, 2, 1, WHITE);
lcd.setRect(lin, 55 , lin+GR_tick, 66, 1, WHITE);
lcd.setRect(lin, 122 , lin+GR_tick, 130, 1, WHITE);
#endif
}

//--------------------------------------------------------------------------------------
void CH_read_PPM(){
for (byte i=0; i < nr_ch; i++){
if (IN_OK[i] == 0){
IN_CH[i] = pulseIn(CH[i], HIGH);
}
if (IN_CH[i] <min_ms or IN_CH[i]> max_ms){
IN_OK[i] = IN_OK[i]+1;
if (IN_OK[i]== 10){IN_OK[i] = 0;}
IN_CH[i]= IN_OK[i];
}
// IN_CH 1 = AILE
// IN_CH 2 = ELEV
// IN_CH 3 = THROTTLE
// IN_CH 4 = RUDDER
// IN_CH 5 = GEAR level

#if DEBUG
Serial.print(" CH"); Serial.print(i+1); Serial.print(": ");Serial.print(IN_CH[i]);
Serial.print("/"); Serial.print((IN_CH[i]-1058)/8);
#endif
} // END for loop
#if DEBUG
Serial.println("");
#endif
if ( IN_CH[0] < min_ms-40 and IN_CH[0] > 0 ){ // Channel 1 is connected to S-PPM
exe_inter = HIGH;
}
}

Advertisement

Berichten: 1
Geregistreerd: 11 Mrt 2017, 10:03

Re: RC Model Zender=> ontvanger puls meter ( NOKIA Display +

Berichtdoor Boele » 11 Mrt 2017, 10:32

#include <floatToString.h>
#include <NOKIAPHILLIPS.h>
kunt u mij deze opsturen via email

Berichten: 17
Geregistreerd: 06 Feb 2013, 19:30

Re: RC Model Zender=> ontvanger puls meter ( NOKIA Display +

Berichtdoor retlawrobbe » 11 Mrt 2017, 10:58

Google eens

#include <floatToString.h> zie https://github.com/mikenz/trackview-ard ... ToString.h
//#include <ColorLCDShield.h> // the same as ColorLCDShield.h
#include <NOKIAPHILLIPS.h> // the same as ColorLCDShield.h

Gebruikers-avatar
Berichten: 253
Geregistreerd: 15 Nov 2015, 11:54

Re: RC Model Zender=> ontvanger puls meter ( NOKIA Display +

Berichtdoor Gij Kieken » 11 Mrt 2017, 14:25

Heel mooi projectje.
Vindt het vreemd dat eea goed werkt met tim en prevtim zijnde een int.

Berichten: 17
Geregistreerd: 06 Feb 2013, 19:30

Re: RC Model Zender=> ontvanger puls meter ( NOKIA Display +

Berichtdoor retlawrobbe » 12 Mrt 2017, 10:17

https://www.arduino.cc/en/Reference/Int
On the Arduino Uno (and other ATMega based boards) an int stores a 16-bit (2-byte) value. This yields a range of -32,768 to 32,767.
Dit is meer dan voldoende.

Gebruikers-avatar
Berichten: 253
Geregistreerd: 15 Nov 2015, 11:54

Re: RC Model Zender=> ontvanger puls meter ( NOKIA Display +

Berichtdoor Gij Kieken » 12 Mrt 2017, 20:19

Net daarom stelde ik het in vraag en dacht beter af te zijn met unsigned long om op later tijdstip geen raar gedrag te ondervinden of vast lopen.
Als het goed werk is dit zeer fijn.

Terug naar Afgeronde projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 2 gasten