Sida 1 av 1

Hjälp med fjärrstyrning

Postat: 30 maj 2005, 18:14:05
av Ackee
Tänkte fjärrstyra min robot och har lägligt kommigt över en sändare och en reciever ifrån easy-radio:
http://www.lprs.co.uk/pdf_directory/238 ... -guide.pdf

Problemet är att jag är osäker hur jag ska få dem att fungera har skrivit följande lilla enkla program bara för att testa men som sagt, det funkar ej så jag antar att jag missat något viktigt :) ny inom radio, första fösöket men nåjå, här är koden skriven i CCS kompilator:

TRANSMITTER:
//////////////
#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=12000000)
#use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7) // Jumpers: 8 to 11, 7 to 12



void main (){
output_b(0x00); //
set_tris_b(0x01); // RB0 = input, resten output

while (1){
if(input(PIN_B0) == 1){
printf("1");
output_high(PIN_B1);
}
printf("2");
}
}

////////

RECIEVER:
//////////

#include <18F452.h>
#include <motor.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=12000000)
#use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7) // Jumpers: 8 to 11, 7 to 12
#define diod1 PIN_B1
#define diod2 PIN_B2
#define diod3 PIN_B3
#define diod4 PIN_B4
#define diod5 PIN_B5
long k=0;
char radioinput=666;

void go(){
output_high(diod5);
delay_ms(10);
output_low(diod5);
delay_ms(10);
radioinput=getc();
k++;
printf("\rRadio input: %u varv: %lu",radioinput,k);
}
void init(){
disable_interrupts(global);
printf("\n\rSTARTING\n");
output_b(0x00); //
set_tris_b(0x00); // RB0 = input, resten output
}
void main (){
init();
delay_ms(100);
while(1){
go();
}
}
/////////////

Har ett rs232 interface mellan reciever PIC och min dator för att kunna följa programmet via hyperterminalen men den hänger sig vid getch() iom att den inte får någon insignal oavsett om jag trycker in switchen (RB0) vid transmittern.

Någon som har tips/idè? :shock:

Postat: 30 maj 2005, 19:10:21
av cyr
Har du testat varje del för sig?

Sändare kopplad till serieport på datorn istället för radio.
Sändare kopplad direkt till mottagare, utan radio.

t.ex...

Postat: 30 maj 2005, 21:10:17
av Icecap
Jag har just använd Easy Radio-moduler och de fungerar kanon.

Som standart är de ställd till 19K2,n,8,1 och det är bara att skicka en seriell ström till dom (max. 180 bytes) och sedan vänta minst 2 seriella bytes tid, då kommer sändaren att sända över den block.

Mottagaren skickar därefter ut de data som ett antal seriella bytes.

Plätt-lätt.

Det finns en mjukvara som man kan ställa in olika parametra med, det kräver en MAX232 (typ) och en serieport på datorn, sen är det klart, det är bara att välja hur det ska ställas in.

Jag fick det upp och köra på 10 min.

Postat: 31 maj 2005, 08:39:21
av Ackee
icecap har du någon liten exempel kod på hur det såg ut när du skickade, är osäker på om det fungerar att bara langa ut det med printf och ta emot med getch nämligen :S

Postat: 31 maj 2005, 10:13:40
av Icecap
Jag skickade vid att först samla ihop i en buffer i minne med 'sprintf' på grund av min utskriftrutin är en interruptbaserat gör-det-själv så jag kan inte använda 'printf', sen skickade jag det rakt av.

I mitt fall består blocken av:
<STX >"0123"<0xFF><ETX> t.ex.

Du kan fint använda 'printf' om inte den är för långsam (2 char delay = sänd blocken), jag har som sagt inte den möjlighet på grund av mitt upplägg.

Postat: 31 maj 2005, 11:30:23
av Ackee
tanken är att jag ska styra roboten via fyra knappar, håller jag in frammåt ska ska den bara mata något i stil med printf("forward"); eller printf("1");, sedan har jag kopplat data out direkt ifrån radio mottagaren till min mottagar pic, sedan tänkte jag kollar rs232 porten (RC7) om jag får in forward, left etc får jag inte det ska den bara stå stilla. Iom att jag använder printf etc så är jag osäker om jag måste ha ett rs232 (MAX232) interface mellan radio mottagaren och min pic. Ska prova mer idag, roboten ska vara klar på tors...deadline och det är jag som släpar efter med detta :) :( blir KAFFE rätt in i venerna eller nå :D

Postat: 31 maj 2005, 12:07:43
av Ackee
enn till fråga, då radion skickar med 19200 baud som default så antar jag att det är lämpligast att min printf och getch också arbetar på 19200 baud, det borde inte vara några problem när det kommer till PIC:ens begränsningar antar jag. Men kan jag ta emot i 19200 men skicka till hyperterminalen i 9600? Nybörjar frågor ;)

Postat: 31 maj 2005, 13:40:29
av Icecap
Ja, men då måste du ställa om baudrate mellan mottagning från radio och sändning till hyperterminal. Men varför inte köra 19K2 på HT?

Postat: 31 maj 2005, 15:30:06
av Ackee
Självklart är det lättast :D satte den till 19200 och det fungerade bra.

Nu så reagerar dock inte getch på att snappa upp vad som komma till data out. Vet inte om det beror på att inget kommer där eller pga att getch inte vill fungera :(

På sändaren har jag kopplat:

PIN 1 (RF GND) - GND
PIN 2 (RF OUT) - Antenn (en enkelledare 16.4cm lång, med isolering på)
PIN 3 (Vcc) - +5V
PIN 4 (Gnd) - GND
PIN 5 (TXD) - RC6/TX på piccen (18f452)

På mottagaren:

PIN 1 (Antenna) - Antenn (likadan som sändaren)
PIN 2 (RF Gnd) - GND
PIN 3 (RSSI) - Inget
PIN 4 (Busy output) -GND
PIN 5 (Serial data out) - RC7/RX på pic
PIN 6 (Serial data in) - +5v
PIN 7 (Host ready input) - GND
PIN 8 (Vcc) - +5v
PIN 9 (Ground) - GND


Sändarens kod är följande:

while (1){

printf("\n Sending...");
}

kopplar jag RC6 på sändar piccen till MAX232 och hyperterminalen så får jag korrekt utskrift.

Mottagrens kod är:

char radioinput = 0;
int k=0;
while(1){
radioinput=getc();
printf("\rRadio input: %u varv:",radioinput,k);
}


Den går ett varv och sedan händer inget pga att den inte får in något på getch antar jag.

Båda piccarna är initierade så:


#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=12000000)
#use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7)



Är väldigt glad över all hjälp! :)

Postat: 31 maj 2005, 19:06:54
av Ackee
får inte ens den seriella kommunikationen att fungera emellan PIC:arna så antagligen är det där skon klämmer :(

Postat: 31 maj 2005, 22:04:34
av Icecap
Jag tycker att du måste ha en fördröjning i sändarens loop, annars får den ju aldrig andrum till att sända i.

Kod: Markera allt

while (1)
  {
  printf("\n Sending...");
  // Här bör det vara en paus på minst 10ms, gärna mer
  }
Sen kan du ju med MAX232 och hyperterminalen kolla om något kommer ur mottagaren.

Jag kopplade den enbart med +, GND och Serout och det rasslade på så fint så du kanske gör rätt med busy osv men jag har inte kommit så långt att det behövs.