//Controlled with a joystick IrDA // ESP32C3 // #include #include #include #include #include "yamazen.h" #define KHZ 38 //変調周波数(kHz) #define PIN_SEND 6 //制御PIN(GPIO3) IRsend irsend(PIN_SEND); #define MAXOFFSET (4095) #define XOFFSET (2360) #define YOFFSET (2335) #define DEFAREA (1000) #define JOYSTICK_VRx 0 //GPIO0(ADC1_0) #define JOYSTICK_VRy 1 //GPIO1(ADC1_1) #define JOYSTICK_SW 2 //GPIO2 #define RETBTN_SW 3 //GPIO3 int joyDirec(int x, int y) { float r, t; int num; //距離を1/10にして計算 x /= 10; y /= 10; r = sqrt((float)x * x + (float)y * y); //0の場合の処理 if(x == 0) { if(y > 0) { t = 90; } else if(y < 0) { t = 270; } else { t = 0; } } else { t = atan(((float)y / x) / 3.1415926 * 180.0); if(x < 0) { t += 180; } else if(y < 0) { t += 360; } } //4エリア判定 if(r > DEFAREA/10) { if(t < 45) { num = 6; //Right } else if(t < 135) { num = 8; //Up } else if(t < 225) { num = 4; //Left } else if(t < 315) { num = 2; //Down } else { num = 6; //Right } } else { num = 5; //Center } return(num); } //送信4Byte(カスタマーコード2Byte+リモコンコード+反転リモコンコード) void send_cmd(uint32_t cmd) { uint64_t send = 0; send = (uint64_t)reverseBits(rmt_address >> 8, 8) << 24; // カスタマーコード(上位8bit) send += (uint64_t)reverseBits(rmt_address&0xff, 8) << 16; // カスタマーコード(下位8bit) send += reverseBits(cmd, 8) << 8; // リモコンコードを順番入れ替えて送信 send += reverseBits(cmd, 8) ^ 0xff; // リモコンコードのビット反転(パリティ) irsend.sendNEC(send); // 送信 #if 0 // デバッグ表示 Serial.printf("Send IR : 0x%08LX", send); Serial.printf("(customer=0x%04X, ", rmt_address); Serial.printf("command=0x%02X)\n", cmd); #endif } void setup() { Serial.begin(115200); pinMode(JOYSTICK_VRx, INPUT); pinMode(JOYSTICK_VRy, INPUT); pinMode(JOYSTICK_SW, INPUT_PULLUP); pinMode(RETBTN_SW, INPUT_PULLUP); irsend.begin(); } int prev_dir = 0; int prev_sw = HIGH; int prev_btn = HIGH; void loop() { int vrx, vry, sw, btn; int dir; #if 1 vrx = analogRead(JOYSTICK_VRx) - XOFFSET; vry = YOFFSET - analogRead(JOYSTICK_VRy); #else //中心値確認版 vrx = analogRead(JOYSTICK_VRx); vry = analogRead(JOYSTICK_VRy); Serial.print("X = "); Serial.print(vrx); Serial.print(", Y = "); Serial.println(vry); delay(1000); #endif sw = digitalRead(JOYSTICK_SW); btn = digitalRead(RETBTN_SW); if(prev_btn != btn) { prev_btn = btn; if(prev_btn == 0) { //return botton ON //irsend.sendRaw(return_raw, sizeof(return_raw) / sizeof(uint16_t), KHZ); send_cmd(return_cmd); } } else if(prev_sw != sw) { prev_sw = sw; if(prev_sw == 0) { //swicth ON //irsend.sendRaw(select_raw, sizeof(select_raw) / sizeof(uint16_t), KHZ); send_cmd(select_cmd); } } else if((dir = joyDirec(vrx, vry)) != prev_dir) { #if 0 //方向デバック Serial.print("direct = "); Serial.println(dir); #endif switch(prev_dir = dir) { case 2: //Down //irsend.sendRaw(down_raw, sizeof(down_raw) / sizeof(uint16_t), KHZ); //irsend.sendNEC(0x4040, 0x16, 1); 動作しない send_cmd(down_cmd); break; case 4: //Left //irsend.sendRaw(left_raw, sizeof(left_raw) / sizeof(uint16_t), KHZ); send_cmd(left_cmd); break; case 6: //Right //irsend.sendRaw(right_raw, sizeof(right_raw) / sizeof(uint16_t), KHZ); send_cmd(right_cmd); break; case 8: //Up //irsend.sendRaw(up_raw, sizeof(up_raw) / sizeof(uint16_t), KHZ); send_cmd(up_cmd); break; } } delay(200); }