ソース (Arduino IDEにコピペして書き込んでください。)
- //
- // G-5500DC controller V1.1 - (c) JM2FCJ 2022
- // 1.0 -> 1.1
- // シリアル実装
- //
-
- #include <Wire.h>
- #define OLED_ADRS 0x3C
-
- // OLED command
- int DisplayON = 0x0F;
- int ClearDisplay = 0x01;
- int ReturnHome = 0x02;
- int CursoleOff = 0x0C;
-
- // DIO
- int s4Pin = 5; // 黒スイッチ: no assign
- int s2Pin = 3; // 白1スイッチ: Flip Mode
- int s3Pin = 4; // 白2スイッチ: Remote Mode
- int s1Pin = 2; // 赤スイッチ: ALL STOP
- int s5Pin = 6; // Presetスイッチ
- int s5LEDPin = 7; // PresetスイッチのLED
- int ELDownPin = 8; // G-5500DC EL down
- int ELUpPin = 9; // G-5500DC EL up
- int AZCCWPin = 10; // G-5500DC AZ CCW
- int AZCWPin = 11; // G-5500DC AZ CW
-
- // ADC
- int ELVRPin = 0; // ADC EL VR
- int AZVRPin = 1; // ACD AZ VR
- int ELPOSPin = 2; // ADC G-5500DC EL
- int AZPOSPin = 3; // ADC G-5500DC AZ
-
- int ELVR = 0;
- int AZVR = 0;
- int ELPOS = 0;
- int AZPOS = 0;
-
- int SerTargetEL = 0;
- int SerTargetAZ = 0;
-
- int FlipMode = 0;
- int RemoteMode = 0;
- int PresetMode = 0;
- char* GotoEL = " ";
- char* GotoAZ = " ";
-
- char L1[20] = ""; // OLED 1行目
- char L2[20] = ""; // OLED 2行目
-
-
- void setup() {
- pinMode(s1Pin, INPUT);
- pinMode(s2Pin, INPUT);
- pinMode(s3Pin, INPUT);
- pinMode(s4Pin, INPUT);
- pinMode(s5Pin, INPUT);
- pinMode(s5LEDPin, OUTPUT);
- pinMode(ELDownPin, OUTPUT);
- pinMode(ELUpPin, OUTPUT);
- pinMode(AZCCWPin, OUTPUT);
- pinMode(AZCWPin, OUTPUT);
-
- Wire.begin(); // I2C init
- init_oled();
-
- Serial.begin(9600);
- Serial.setTimeout(100);
-
- attachInterrupt(0, allstop, FALLING);
- }
-
-
- void loop() {
- char SerAZ[3];
- char SerEL[3];
-
- ELVR = analogRead(ELVRPin) * 180.0 / 1023.0;
- AZVR = analogRead(AZVRPin) * 450.0 / 1023.0;
- ELPOS = (analogRead(ELPOSPin) - 27) * 180.0 / 890.0;
- AZPOS = (analogRead(AZPOSPin) - 13) * 450.0 / 907.0;
-
- delay(100);
-
- if(RemoteMode == 1){
- PresetMode = 0;
- digitalWrite(s5LEDPin, LOW);
-
- FlipMode = 0;
-
- if(Serial.findUntil("W", "W")){
- delay(10);
- SerAZ[0] = Serial.read();
- delay(1);
- SerAZ[1] = Serial.read();
- delay(1);
- SerAZ[2] = Serial.read();
- delay(1);
- SerEL[0] = Serial.read(); // スペースを読み飛ばすため必要
- delay(1);
- SerEL[0] = Serial.read();
- delay(1);
- SerEL[1] = Serial.read();
- delay(1);
- SerEL[2] = Serial.read();
-
- if(SerAZ[0] != 0){
- SerTargetAZ = (SerAZ[0]-48) * 100 + (SerAZ[1]-48) * 10 + (SerAZ[2]-48) * 1;
- SerTargetEL = (SerEL[0]-48) * 100 + (SerEL[1]-48) * 10 + (SerEL[2]-48) * 1;
- }
- else{
- SerTargetAZ = 0;
- SerTargetEL = 0;
- }
-
- sprintf(L1, "ELr %3d AZr %3d ", SerTargetEL, SerTargetAZ);
- writeCommand(0x80);
- for(int i=0; i<20; i++){
- writeData(L1[i]);
- }
- }
- }
-
- if(digitalRead(s2Pin) == LOW){
- delay(50);
- if(FlipMode == 0){
- FlipMode = 1;
- }
- else{
- FlipMode = 0;
- }
- }
-
- if(digitalRead(s3Pin) == LOW){
- delay(50);
- if(RemoteMode == 0){
- RemoteMode = 1;
-
- SerTargetEL = ELPOS;
- SerTargetAZ = AZPOS;
-
- sprintf(L1, "Waiting for Data ");
- writeCommand(0x80);
- for(int i=0; i<20; i++){
- writeData(L1[i]);
- }
- }
- else{
- RemoteMode = 0;
- }
- }
-
- if(digitalRead(s5Pin) == LOW){
- delay(50); // 1回押しなら、PresetMode1 角度があってもPresetを継続
- if(PresetMode == 0){
- RemoteMode = 0;
- PresetMode = 1;
- digitalWrite(s5LEDPin, HIGH);
- }
- else{
- RemoteMode = 0;
- PresetMode = 0;
- digitalWrite(s5LEDPin, LOW);
- }
- delay(1000); // 長押しなら、PresetMode2にする 角度があったらPreset終了
- if(digitalRead(s5Pin) == LOW){
- RemoteMode = 0;
- PresetMode = 2;
- digitalWrite(s5LEDPin, HIGH);
- delay(100);
- digitalWrite(s5LEDPin, LOW);
- delay(100);
- digitalWrite(s5LEDPin, HIGH);
- delay(100);
- digitalWrite(s5LEDPin, LOW);
- delay(100);
- digitalWrite(s5LEDPin, HIGH);
- delay(100);
- digitalWrite(s5LEDPin, LOW);
- delay(100);
- digitalWrite(s5LEDPin, HIGH);
- }
- }
-
- if((PresetMode == 1) || (PresetMode == 2)){
- if((ELVR - ELPOS) > 0){
- digitalWrite(ELDownPin, LOW);
- digitalWrite(ELUpPin, HIGH);
- GotoEL = "Up ";
- }
- else if((ELVR - ELPOS) < 0){
- digitalWrite(ELUpPin, LOW);
- digitalWrite(ELDownPin, HIGH);
- GotoEL = "Dwn";
- }
- else{
- digitalWrite(ELUpPin, LOW);
- digitalWrite(ELDownPin, LOW);
- GotoEL = " ";
- if(PresetMode == 2){
- if(((AZVR - AZPOS) > 1 ) || ((AZVR - AZPOS) < -1 )){ // AZがまだあっていないときはPreset継続
- ;
- }
- else{ // AZがあっていたらPresetを抜ける
- PresetMode = 0;
- digitalWrite(s5LEDPin, LOW);
- }
- }
- }
-
- if((AZVR - AZPOS) > 1){
- digitalWrite(AZCCWPin, LOW);
- digitalWrite(AZCWPin, HIGH);
- GotoAZ = "CW ";
- }
- else if((AZVR - AZPOS) < -1){
- digitalWrite(AZCWPin, LOW);
- digitalWrite(AZCCWPin, HIGH);
- GotoAZ = "CCW";
- }
- else{
- digitalWrite(AZCWPin, LOW);
- digitalWrite(AZCCWPin, LOW);
- GotoAZ = " ";
- if(PresetMode == 2){
- if(((ELVR - ELPOS) > 0 ) || ((ELVR - ELPOS) < 0 )){ // ELがまだあっていないときはPreset継続
- ;
- }
- else{ // ELがあっていたらPresetを抜ける
- PresetMode = 0;
- digitalWrite(s5LEDPin, LOW);
- }
- }
- }
- }
- else if(RemoteMode == 1){
- if((SerTargetEL - ELPOS) > 0){
- digitalWrite(ELDownPin, LOW);
- digitalWrite(ELUpPin, HIGH);
- GotoEL = "Up ";
- }
- else if((SerTargetEL - ELPOS) < 0){
- digitalWrite(ELUpPin, LOW);
- digitalWrite(ELDownPin, HIGH);
- GotoEL = "Dwn";
- }
- else{
- digitalWrite(ELUpPin, LOW);
- digitalWrite(ELDownPin, LOW);
- GotoEL = " ";
- }
-
- if((SerTargetAZ - AZPOS) > 1){
- digitalWrite(AZCCWPin, LOW);
- digitalWrite(AZCWPin, HIGH);
- GotoAZ = "CW ";
- }
- else if((SerTargetAZ - AZPOS) < -1){
- digitalWrite(AZCWPin, LOW);
- digitalWrite(AZCCWPin, HIGH);
- GotoAZ = "CCW";
- }
- else{
- digitalWrite(AZCWPin, LOW);
- digitalWrite(AZCCWPin, LOW);
- GotoAZ = " ";
- }
- }
- else{
- digitalWrite(ELDownPin, LOW);
- digitalWrite(ELUpPin, LOW);
- digitalWrite(AZCCWPin, LOW);
- digitalWrite(AZCWPin, LOW);
- GotoEL = " ";
- GotoAZ = " ";
- }
-
- if(FlipMode == 0){
- sprintf(L1, "EL %3d AZ %3d ", ELVR, AZVR);
- if((ELPOS < -3) && (AZPOS < -3)){
- sprintf(L2, "Rotor - offline ");
- RemoteMode = 0;
- }
- else{
- sprintf(L2, "%s %3d %s %3d ", GotoEL, ELPOS, GotoAZ, AZPOS);
- }
- }
- else{
- if(AZPOS < 180){
- AZPOS = AZPOS + 180;
- }
- else{
- AZPOS = AZPOS - 180;
- }
-
- if(AZVR < 180){
- AZVR = AZVR + 180;
- }
- else{
- AZVR = AZVR - 180;
- }
-
- sprintf(L1, "EL* %3d AZ* %3d ", -(ELVR - 180), AZVR);
- if(((ELPOS - 180) < -3) && ((AZPOS - 180) < -3)){
- sprintf(L2, "Rotor - offline ");
- }
- else{
- sprintf(L2, "%s %3d %s %3d ", GotoEL, -(ELPOS -180), GotoAZ, AZPOS);
- }
- }
-
- if(RemoteMode == 0){
- writeCommand(0x80);
- for(int i=0; i<20; i++){
- writeData(L1[i]);
- }
- }
-
- writeCommand(0x20+0x80);
- for(int i=0; i<20; i++){
- writeData(L2[i]);
- }
-
- contrast_max();
- }
-
-
- void allstop(){
- RemoteMode = 0;
- PresetMode = 0;
- FlipMode = 0;
-
- digitalWrite(s5LEDPin, LOW);
-
- digitalWrite(ELDownPin, LOW);
- digitalWrite(ELUpPin, LOW);
- digitalWrite(AZCCWPin, LOW);
- digitalWrite(AZCWPin, LOW);
- }
-
-
- void writeData(byte t_data)
- {
- Wire.beginTransmission(OLED_ADRS);
- Wire.write(0x40);
- Wire.write(t_data);
- Wire.endTransmission();
- delay(1);
- }
-
-
- void writeCommand(byte t_command)
- {
- Wire.beginTransmission(OLED_ADRS);
- Wire.write(0x00);
- Wire.write(t_command);
- Wire.endTransmission();
- delay(1);
- }
-
-
- void contrast_max()
- {
- writeCommand(0x2a);
- writeCommand(0x79);
- writeCommand(0x81);
- writeCommand(0xFF);
- writeCommand(0x78);
- writeCommand(0x28);
- delay(1);
- }
-
-
- void init_oled()
- {
- delay(100);
- writeCommand(ClearDisplay);
- delay(20);
- writeCommand(ReturnHome);
- delay(20);
- writeCommand(DisplayON);
- delay(20);
- writeCommand(ClearDisplay);
- delay(20);
- writeCommand(CursoleOff);
- delay(20);
- }