/*
* Drogon Remote Control for Raspberry Pi
*
* cc -o DRCProMini DRCProMini.c -lwiringPi
*/
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <wiringPi.h>
#include <wiringSerial.h>
#define TIMEOUT 1000
#define DEBUG 0
int readSerial(int fd,int timeout) {
unsigned long endTime;
int ch;
if(DEBUG)printf("millis=%d\n",millis());
endTime = millis () + timeout;
if(DEBUG)printf("endTime=%d\n",endTime);
while (1) {
if (millis () > endTime) return -1;
if (serialDataAvail (fd)) {
ch = serialGetchar (fd);
if(DEBUG)printf (" -> %02x\n", ch);
if (ch == 2)
return -2;
return ch;
return (ch-1);
} // end if
} // end while
}
// Send Ping (0x40)
// Input Parameters
// fd:File Descriptor
// timeout:time out(sec)
// Return Value
// -1:time out
// 1:ok
int sendPing(int fd) {
serialPutchar(fd, 0x40);
return readSerial(fd, TIMEOUT);
}
// Set Pin NN OFF (0x30)
// Input Parameters
// fd:File Descriptor
// pin:Pin Number
// Return Value
// -1:time out
// -2:illegal pin number
// 1:ok
int setOff(int fd, int pin) {
serialPutchar(fd, 0x30);
serialPutchar(fd, pin);
return readSerial(fd, TIMEOUT);
return;
}
// Set Pin NN ON (0x31)
// Input Parameters
// fd:File Descriptor
// pin:Pin Number
// Return Value
// -1:time out
// -2:illegal pin number
// 1:ok
int setOn(int fd, int pin) {
serialPutchar(fd, 0x31);
serialPutchar(fd, pin);
return readSerial(fd, TIMEOUT);
return;
}
// Set Pin NN as Input (0x69)
// Input Parameters
// fd:File Descriptor
// pin:Pin Number
// Return Value
// -1:time out
// -2:illegal pin number
// 1:ok
int setInput(int fd, int pin) {
serialPutchar(fd, 0x69);
serialPutchar(fd, pin);
return readSerial(fd, TIMEOUT);
return;
}
// Set Pin NN as Output (0x6F)
// Input Parameters
// fd:File Descriptor
// pin:Pin Number
// Return Value
// -1:time out
// -2:illegal pin number
// 1:ok
int setOutput(int fd, int pin) {
serialPutchar(fd, 0x6F);
serialPutchar(fd, pin);
return readSerial(fd, TIMEOUT);
return;
}
// Set Pin NN as PWM (0x70)
// Input Parameters
// fd:File Descriptor
// pin:Pin Number
// Return Value
// -1:time out
// -2:illegal pin number
// 1:ok
int setPwm(int fd, int pin) {
serialPutchar(fd, 0x70);
serialPutchar(fd, pin);
return readSerial(fd, TIMEOUT);
return;
}
// Set PWM value on Pin NN (0x76)
// Input Parameters
// fd:File Descriptor
// pin:Pin Number
// value:PWM value
// Return Value
// -1:time out
// -2:illegal pin number
// 1:ok
int setPwmValue(int fd, int pin, int value) {
serialPutchar(fd, 0x76);
serialPutchar(fd, pin);
serialPutchar(fd, value);
return readSerial(fd, TIMEOUT);
return;
}
// Read back Digital Pin NN (0x72)
// Input Parameters
// fd:File Descriptor
// pin:Pin Number
// timeout:time out(sec)
// Return Value
// -1:time out
// -2:illegal pin number
// 0:Digital Value
// 1:Digital Value
int readDigital(int fd, int pin) {
serialPutchar(fd, 0x72);
serialPutchar(fd, pin);
return readSerial(fd,TIMEOUT);
}
// Read back Analog Pin NN (0x61)
// Input Parameters
// fd:File Descriptor
// pin:Pin Number
// timeout:time out(sec)
// Return Value
// -1:time out
// 0-1023:Analog Vlaue
int readAnalog(int fd, int pin) {
unsigned long endTime;
int ch;
int flag = 0;
int ret;
if(DEBUG)printf("millis=%d\n",millis());
endTime = millis () + TIMEOUT;
if(DEBUG)printf("endTime=%d\n",endTime);
serialPutchar(fd, 0x61);
serialPutchar(fd, pin);
while (1) {
if (millis () > endTime) return -1;
if (serialDataAvail (fd)) {
ch = serialGetchar (fd);
if(DEBUG)printf (" -> %02x\n", ch);
if (flag == 0) {
ret=ch<<8;
flag=1;
} else {
ret=ret+ch;
return ret;
}
} // end if
} // end while
}
int main ()
{
int fd;
int ret,i;
// if ((fd = serialOpen ("/dev/ttyAMA0", 9600)) <
0) {
if ((fd = serialOpen ("/dev/ttyAMA0", 115200)) <
0) {
fprintf (stderr, "Unable to open serial
device: %s\n", strerror (errno)) ;
return 1 ;
}
if (wiringPiSetup () == -1) {
fprintf (stdout, "Unable to start
wiringPi: %s\n", strerror (errno)) ;
return 1 ;
}
printf("DRC for ProMini\n");
// sendPing
printf("sendPing=%d\n",sendPing(fd));
// setOutput setON setOff
ret=setOutput(fd,8);
printf("setOutput[8]=%d\n",ret);
if (ret == 1) {
for(i=0;i<5;i++) {
setOn(fd,8);
delay(500);
setOff(fd,8);
delay(500);
} // end for
} // end if
// setPwm setPwmValue
ret=setPwm(fd,9);
printf("setPwm[9]=%d\n",ret);
if (ret == 1) {
for(i=0;i<255;i=i+10) {
setPwmValue(fd,9,i);
delay(200);
} // end for
} // end if
setPwmValue(fd,9,0);
// setInput readDigital
printf("setInput[10]=%d\n",setInput(fd,10));
ret=readDigital(fd,10);
printf("readDigital[10]=%d\n",ret);
printf("setInput[11]=%d\n",setInput(fd,11));
ret=readDigital(fd,11);
printf("readDigital[11]=%d\n",ret);
// readAnalog
ret=readAnalog(fd,0);
printf("readAnalog[A0]=%d\n",ret);
ret=readAnalog(fd,1);
printf("readAnalog[A1]=%d\n",ret);
ret=readAnalog(fd,2);
printf("readAnalog[A2]=%d\n",ret);
ret=readAnalog(fd,3);
printf("readAnalog[A3]=%d\n",ret);
return 0 ;
}
|