Arduinoに
#include <stdio.h> /* Standard input/output definitions */
#include <string.h> /* String function definitions */
#include <unistd.h> /* UNIX standard function definitions */
#include <fcntl.h> /* File control definitions */
#include <errno.h> /* Error number definitions */
#include <termios.h> /* POSIX terminal control definitions */
#include <getopt.h> // process commandline options
int main(int argc, char *argv[])
{
int opt;
char *port, *width;
struct option long_options[] = {
{"port", required_argument, NULL, 'p'},
{"width", required_argument, NULL, 'w'}
};
while((opt = getopt_long(argc, argv, "", long_options, NULL)) != -1) {
switch(opt) {
case 'p':
port = optarg;
break;
case 'w':
width = optarg;
break;
}
}
if(port == NULL | width == NULL) {
printf("--port [port] --width [pulse width]\n");
return 0;
}
// open serialport
int fd = open(port, O_RDWR | O_NOCTTY | O_NDELAY);
if(fd < 0) {
printf("Cannot open port\n");
return 0;
}
struct termios options;
// get current settings
tcgetattr(fd, &options);
// set baudrate to 115200
cfsetispeed(&options, B115200);
cfsetospeed(&options, B115200);
// set new settings
tcsetattr(fd, TCSADRAIN, &options);
int n;
unsigned int w;
sscanf(width, "%d", &w);
n = write(fd, &w, 2);
close(fd);
return 0;
}
unsigned long ts;
unsigned int width = 1500;
char bytes[2];
void setup() {
Serial.begin(115200);
ts = micros();
DDRB = DDRB | B00100000; // pin 13
}
void loop() {
unsigned long t = micros() - ts;
if (Serial.available() > 1) {
Serial.readBytes(bytes, 2);
width = (bytes[1] << 8) | (bytes[0] & 0xff);
}
if (t <= width) {
PORTB = PORTB | B00100000;
}
else {
PORTB = B00000000;
}
if (t >= 20000) {
ts = micros();
}
}