/*
* Drogon Remote Control for Raspberry Pi
*
* cc -o DRCATtiny DRCATtiny.c -lwiringPi
*/
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <wiringPi.h>
#include <wiringSerial.h>
#define TIMEOUT 1000
#define ATTINY84
//#define ATTINY85
#if defined(ATTINY84)
#define outPin 8
#define pwmPin 7
#define in1Pin 6
#define in2Pin 5
#define an1Pin 4
#define an2Pin 3
#define an3Pin 2
#define an4Pin 1
#define BRate 4800
#define Hello "DRC for ATtiny84"
#endif
#if defined(ATTINY85)
#define outPin 2
#define pwmPin 3
#define in1Pin 4
#define in2Pin 4
#define an1Pin 4
#define an2Pin 4
#define an3Pin 4
#define an4Pin 4
#define BRate 4800
#define Hello "DRC for ATtiny85"
#endif
#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
// return 0-1023
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", BRate)) <
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("%s\n",Hello);
// sendPing
printf("sendPing=%d\n",sendPing(fd));
// setOutput setON setOff
ret=setOutput(fd,outPin);
printf("setOutput[%d]=%d\n",outPin,ret);
if (ret == 1) {
for(i=0;i<5;i++) {
setOn(fd,outPin);
delay(500);
setOff(fd,outPin);
delay(500);
} // end for
} // end if
// setPwm setPwmValue
ret=setPwm(fd,pwmPin);
printf("setPwm[%d]=%d\n",pwmPin,ret);
if (ret == 1) {
for(i=0;i<255;i=i+10) {
setPwmValue(fd,pwmPin,i);
delay(200);
} // end for
} // end if
setPwmValue(fd,pwmPin,0);
// setInput readDigital
printf("setInput[%d]=%d\n",in1Pin,setInput(fd,in1Pin));
ret=readDigital(fd,in1Pin);
printf("readDigital[%d]=%d\n",in1Pin,ret);
printf("setInput[%d]=%d\n",in2Pin,setInput(fd,in2Pin));
ret=readDigital(fd,in2Pin);
printf("readDigital[%d]=%d\n",in2Pin,ret);
// readAnalog
ret=readAnalog(fd,an1Pin);
printf("readAnalog[A%d]=%d\n",an1Pin,ret);
ret=readAnalog(fd,an2Pin);
printf("readAnalog[A%d]=%d\n",an2Pin,ret);
ret=readAnalog(fd,an3Pin);
printf("readAnalog[A%d]=%d\n",an3Pin,ret);
ret=readAnalog(fd,an4Pin);
printf("readAnalog[A%d]=%d\n",an4Pin,ret);
return 0 ;
}
|