半日で作る倒立振子
ステップ 9: シリアル・モニタを使った振子の操縦
http://www.instructables.com/id/%E5%8D%8A%E6%97%A5%E3%81%A7%E4%BD%9C%E3%82%8B%E5%80%92%E7%AB%8B%E6%8C%AF%E5%AD%90/9/?lang=ja
を改造し、TVリモコンで操縦に挑戦してみました。
カッチリではなく、ゆる~く変化させることが出来ました。
自作の木製CNCというか、合板製のフレームとパーチクルボードのステージで構成した自作CNCを中心に、いろいろ遊んでいます。自作CNCは、「合板製CNC」と名付けました。 旧サイトは、http://blog.seyo.info/diary/ です。製作初期の段階はそちらで。最近は、はんだコテを握って電子工作をしています。
byte bitmap[] = {
0b00000010, //- ←キャラクタコード- → アスキーコード45 → bitmap[0]
0b00000001, //. ←キャラクタコード. → アスキーコード46 → bitmap[1]
0b00000000, //SPASE
0b11111100, //0 ←キャラクタコード0 → アスキーコード48 → bitmap[3]
0b01100000, //1
0b11011010, //2
0b11110010, //3
0b01100110, //4
0b10110110, //5
0b10111110, //6
0b11100000, //7
0b11111110, //8
0b11110110, //9
0b00000000, //
0b00000000, //
0b00000000, //
0b00000000, //
0b00000000, //
0b00000000, //
0b00000000, //
0b11101110, //A ←キャラクタコードA → アスキーコード65 → bitmap[20]
0b00111110, //B
0b10011100, //C
0b01111010, //D
0b10011110, //E
0b10001110, //F
0b10111100, //G
0b00101110, //H
0b00100000, //I
0b01111000, //J
0b10101110, //K
0b00011100, //L
0b11101100, //M
0b00101010, //N
0b00111010, //O
0b11001110, //P
0b11100110, //Q
0b00001010, //R
0b00110110, //S
0b00011110, //T
0b00111000, //U
0b01111100, //V
0b01010100, //W
0b01101110, //X
0b01110110, //Y
0b11011000, //Z ←キャラクタコードZ → アスキーコード90 → bitmap[45]
0b00000000, //
0b00000000, //
0b00000000, //
0b00000000, //
0b00000000, //
0b00000000, //
0b10000000, //a セグメントa点灯←キャラクタコードa → アスキーコード97 → bitmap[52]
0b01000000, //b セグメントb点灯
0b00100000, //c セグメントc点灯
0b00010000, //d セグメントd点灯
0b00001000, //e セグメントe点灯
0b00000100, //f セグメントf点灯
0b00000010, //g セグメントg点灯
0b00000001, //h '.'(dot)←キャラクタコードh → アスキーコード104 → bitmap[59]
0b10000010, //i 横2本
0b00010010, //j 横2本
0b10010000, //k 横2本
0b00011100, //l L
0b11110000, //m Cの反対
0b00001100, //n 縦棒
0b01101100, //o 縦棒2本
0b11001110, //p P
0b10000000, //q セグメントa点灯
0b01000000, //r セグメントb点灯
0b00100000, //s セグメントc点灯
0b00010000, //t セグメントd点灯
0b00001000, //u セグメントe点灯
0b00000100, //v セグメントf点灯
0b00000010, //w セグメントg点灯
0b10010010, //x 横3本
0b00000000, //y ' '(space)
0b00000010, //z '-'(minus)
};
/*
GPS radio clock 1.56
2014/06/08 daikunomokichi
*/
#include <Wire.h> //I2C
#include <wI2cLcdACM1602.h> //LCD
wI2cLcdACM1602 lcd;
/*
MTK3339 コマンドのメモ
$PMTK251,19200*22 CR+LF 19200bps
$PMTK251,57600*2C CR+LF 57600bps
$PMTK220,500*2B CR+LF データ更新レート 2Hz 9600bps以上
$PMTK220,200*2C CR+LF データ更新レート 5Hz 38400bps以上
*/
int dHour = 0; //JST時
int dHour0 = 0;
int dHour1 = 0;
int dHour2 = 0;
int dMin = 0; //内部分
int dMin0 = 0;
int dMin1 = 0;
int dSec = 0; //内部秒
int dSec0 = 0;
int dSec1 = 0;
int dSec2 = 0;
int dIntpin = 2; //割込D2
char buf[256];
char c;
int count = 0;
char *gpsTime, *gpsCnt; //個別データ用の文字列用ポインタ
char dRun = 0; //補足完了
void setup()
{
Serial.begin(9600);
Serial.println("$PMTK220,500*2B"); //データ更新レート 2Hz
Wire.begin(); //I2C初期化
lcd.begin(); //LCD初期化
lcd.clear(); //全クリア
lcd.noBlink(); //カーソル点滅なし
lcd.noCursor(); //カーソル表示なし
lcd.setCursor(0, 0);
lcd.print("Preliminary GPS"); //最初のメッセージ表示
lcd.setCursor(0, 1);
lcd.print("1.56 by mokichi"); //最初のメッセージ表示
pinMode(dIntpin, INPUT);
attachInterrupt(0, yCnt, RISING);
//attachInterrupt(0,yCnt, FALLING); //HIGHからLOW
delay(1000);
lcd.clear();
}
void loop()
{
count = 0;
do {
if (Serial.available()) {
buf[count] = Serial.read();
count++;
}
if (count > 250) {
break;
}
} while (buf[count - 1] != 0x0A);
buf[count] = '\0';
if (0 == strncmp("$GPGGA", buf, 6)) {
strtok(buf, ",");
gpsTime = strtok(NULL, ","); //m1>UTC時刻の抽出
strtok(NULL, ","); //m2
strtok(NULL, ","); //c1
strtok(NULL, ","); //m3
strtok(NULL, ","); //c2
strtok(NULL, ","); //d1
gpsCnt = strtok(NULL, ","); //d2>測位に使用した人工衛星の個数
lcd.setCursor(14, 1);
lcd.print(gpsCnt);
lcd.print(" ");
dMin0 = gpsTime[2];
dMin1 = gpsTime[3];
dMin = ((dMin0 - 48) * 10) + dMin1 - 48;
dSec0 = gpsTime[4];
dSec1 = gpsTime[5];
dSec2 = ((dSec0 - 48) * 10) + dSec1 - 48;
dHour0 = gpsTime[0];
dHour1 = gpsTime[1];
dHour2 = ((dHour0 - 48) * 10) + dHour1 - 39;
switch (dHour2) {
case 24:
case 25:
case 26:
case 27:
case 28:
case 29:
case 30:
case 31:
case 32:
dHour = dHour2 - 24;
break;
default:
dHour = dHour2;
break;
}
}
if (dRun != 0) {
lcd.setCursor(0, 0);
lcd.print("GPS radio clock");
}
lcd.setCursor(6, 1);
lcd.print(dSec / 10);
lcd.print(dSec % 10);
lcd.setCursor(0, 1);
lcd.print(dHour / 10);
lcd.print(dHour % 10);
lcd.print(":");
lcd.print(dMin / 10);
lcd.print(dMin % 10);
lcd.print(":");
lcd.setCursor(8, 1);
lcd.print("(JST)");
lcd.print(char(222));
}
void yCnt()
{
dSec++;
if (dSec > 59) {
dSec = 0;
}
if (59 == dSec2) {
dRun = -1;
dSec = 0;
}
}
/*
Blink
Turns on an LED on for one second, then off for one second, repeatedly.
This example code is in the public domain.
*/
// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
int led = 13;
// the setup routine runs once when you press reset:
void setup()
{
// initialize the digital pin as an output.
pinMode(led, OUTPUT);
}
// the loop routine runs over and over again forever:
void loop()
{
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}