半日で作る倒立振子
ステップ 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 }