Vol.892 12.Apr.2024

IR(13)_I2Cキーユニット利用リモコン 電動鉛筆削り機を修理

R 赤外線リモコン (13)  〜I2Cキーユニット利用リモコン

by fjk

 abc889のPIC+LCDユニットと、abc891で作成した4x3キーユニットを使ってSONY/IOdata(NEC)リモコンを作成した。
 ソフトはabc889リストにI2Cキー入力データ処理部として赤字部分を追加した。
 キーユニットから現在のkeyデータを取込、前回のデータと異なる場合、新たにキーが押されたと判断し、その位置に対応する赤外線信号を出力している。
 PIC-BASE14ボードの黄ボタンを押すと、赤外線コード出力モードをIOdataかSONY(LED点灯)に切り替えることができる。


SONY赤外線コード送信例

【プログラム】 abc892_18426.c(zip)  (赤字はabc889に追加・変更した部分)

/**************************************(abc892_18426.c)***
 *  NEC/SONY赤外線リモコンの送受信 with 4x3Key
 **********************************************************/

#include "mcc_generated_files/mcc.h"
#include "string.h"
#include "stdlib.h"
#include "i2cLCD_ST7032i.h"

#define MAXDATA 90                          // 赤外線データー配列数
#define MAXADDR 10                          // SONYアドレス配列数
//#define BFSIZE  20                        // eusart.hで定義
#define SLVADR  0x40                        // 4x3キーのI2Cアドレス

	・・・(途中省略)

// 事前登録赤外線コード(SONY)
uint16_t sDt[] = {  0x0B0A, 0x0707, 0x0203, 0x0100,   // 12bit例
                    0xB4E9, 0xBAEA, 0xB9AB, 0xB4AA,   // 15bit例
                    0xC410, 0xC309, 0xC206, 0xC103 }; // 20bit例

uint16_t sAd[] = {  0x04B9, 0x0CB9, 0x14B9, 0x0A7A,
                    0x1C5A, 0x1D5A, 0x1E5A, 0x10FA }; // アドレス

// 事前登録赤外線コード(IOdata)
uint16_t IO2[] = {  0xE014, 0x7084, 0x4084, 0x1084,
                    0xA084, 0x8084, 0x5084, 0x2084,
                    0xF014, 0x9084, 0x6084, 0x3084 }; // IOdata例

	・・・(途中省略)

/*-------------------------------------------
 *            Main application
 *-------------------------------------------*/
void main(void)
{
    uint8_t  ird;                           // 赤外線データ
    uint8_t  sbt;                           // ビットセット用シフトバイト
    uint8_t  bct;                           // 有効ビットデータカウンタ 
    uint8_t  sgf;                           // データ有効フラグ
    uint16_t sDat;                          // SONY送信データ
    uint16_t sAdr;                          // SONY送信アドレス
    char     *end;                          // 文字列切り出し処理用

    uint16_t key;                           // キーユニットデータ
    uint16_t keyLate;                       // 前回のキーデータ
    uint16_t keyP;                          // キー位置データ(0-11)
    uint8_t  iMode = 1;                     // 赤外線モード(SONY=1)

    SYSTEM_Initialize();                    // デバイス初期化
    LCD_init();                             // LCD初期化

	・・・(途中省略)

    // ====== 赤外線信号の受信・送出ループ =====
    while((p_PR < MAXDATA))                 // バッファ満杯まで繰返
    {
        if(sFlg){                           // usb受信データがあれば?
            if(strchr(rBuf,'X') || strchr(rBuf,'x')){
                sDat = (uint16_t)strtol(rBuf, &end, 16);
                sAdr = (uint16_t)strtol(end,  NULL, 16);
                send_SONY(sDat,sAdr);       // データを送信
            }else{
                uint8_t n = atoi(rBuf);
                if(n > 0 & n < 4) send_IOdata(n-1);
            }
            sFlg = 0;                       // シリアルフラグクリア
            printf("\n\r");
        }
				
        if(PORTCbits.RC4 == 0){             // 黄ボタンが押された?
            if(iMode)	IO_RC2_SetLow();
            else     	IO_RC2_SetHigh();
            iMode ^= 0x01;
             __delay_ms(1000);              // チャタリング対策
        }

        // ----- I2C受信データ(key)処理
        I2C1_ReadNBytes(SLVADR, &key, 2);   // キー入力I2C受信
        if(key){                            // 4x3キーが押された?
            if(key != keyLate){             // 前回と異なるか?
                keyP = key & 0x0F;
                if(keyP < 12){              // データが有効か?
                    if(iMode){              // SONYモードか?
                        sDat = sDt[keyP];
                        if((sDat & 0x8000) && !(sDat & 0x0080)){
                            sAdr = sAd[((sDat >> 8) & 0x07)];
                        }else{
                            sAdr = 0;
                        }
                        send_SONY(sDat, sAdr);      // SONYコード送信
                    }else{
                        send_IOdata((uint8_t)keyP); // IOdataコード送信
                    }
                }
            }
        }
        keyLate = key;

        // ----- 赤外線信号受信 ----

			・・・(途中省略)

            Sony = 7;                       // -> SONY Mode
            // IO_RC2_SetHigh();            // コメントに

			・・・(途中省略)

            Sony = 0;                       // -> NEC Mode
            // IO_RC2_SetLow();             // コメントに

			・・・(以下省略)


S 電動鉛筆削り機を修理

by fjk

 通長年使っていた電動鉛筆削り機(AC電源)の削り刃が廻らず、鉛筆が削れなくなった。
 自分で修理できるかな、と分解してみたところ、モーター軸のプラスチック歯車(13歯、外径約9mm、モジュール0.6?、内径3mm)が割れていた。
 同じ歯車を探してみるが、モジュール0.6で13歯のプラスチック歯車はなかなか見つからない。Amazonで数種類入りのピニオンギヤセット(499円)を見つけたのでこれを入手。
 セットの中で使えそうな歯車(15歯、外径約8mm、モジュール0.5、内径3mm)と割れた歯車ではモジュールなどが異なるが、ダメ元ではめてみると何とか噛み合って回りそうなので、電源を入れて、鉛筆を差し込んで見ると、刃が廻り鉛筆が綺麗に削れた。歯車が正しい組み合わせではないので、いつまで持つか判らないが、ゴミから鉛筆削り機に復活した。


削れなくなった鉛筆削り

割れたプラスチック歯車

購入した歯車セット

(修理後)歯間に隙間があるが・

※ 歯車・モジュールについての詳細は、モノタロウなどを参照


※ 本レポートの参考・利用は、あくまでも自己責任でお願いします。


IR(13)_I2Cキーユニット利用リモコン 電動鉛筆削り機を修理