JH7UBCブログ

アマチュア無線 電子工作 家庭菜園など趣味のブログです

ATtiny402 エレキー

2023-08-28 16:13:20 | ATtiny
 ATtiny402でエレキーを作ってみます。

 回路図です。
 パドルはDOTをD1(PA7)に、DASHをD2(PA1)に接続し、各ピンは、10kΩでプルアップしています。
 スピード調節用に10kΩボリュームの電圧をAD変換して0~1023の値で読み込みます。
 送信機用はD3に出力し、それをトランジスタのオープンコレクタで送信機のKEY接続します。出力のモニターとしてLEDを接続しています。
 サイドートーンは、PWM4(PA3)にPWM信号で出力し、スピーカーで音を聞きます。
 


 エレキーのアルゴリズムです。
 このフローチャートは、以前Raspberry Pi Picoでエレキーを作った時のものです。ATtiny402では、Timer割り込みを使わないで、whileループ内で処理を行います。

 それでは、DOT出力とDASH出力は、どれだけの時間なのでしょうか。
 DOTとSPACEは同じ時間、DASHはDOTの3倍です。

 アマチュア無線の場合、CWの送信速度は一般的に20wpm(20 word per minute)程度です。1wordはPARISという符号を基準にしますので5文字、50DOTに相当します。したがって、20wpmの場合は、1DOTは60msとなります。
 
 CWスピードの調整範囲は、
 1DOT=40ms(30wpm=150字/分)から1DOT=200ms(6wpm)としました。
 ADコンバータから得られる0~1023を4で割った値0~255を利用します。

 スケッチです。
 乾電池2本(3V)動作とPWMの周波数の関係で、クロックは16MHzとしてコンパイルしました。
-------------------------------------------
/*
 * ATtiny402 TLEKEY
 * 2023.8.28
 * JH7UBC Keiji Hata
 */

#define SPEED 0
#define DOTKEY 1
#define DASHKEY 2
#define TX 3
#define SIDETONE 4
bool Dot_flag = false;
bool Dash_flag = false;
uint16_t dot_time;//dot_time=0~255

void setup() {
   pinMode(DOTKEY,INPUT);
   pinMode(DASHKEY,INPUT);
   pinMode(TX,OUTPUT);
   pinMode(SIDETONE,OUTPUT);
   digitalWrite(TX,LOW);
   analogWrite(SIDETONE,0);//サイドトーンを出さない
}

void loop() {
   dot_time = analogRead(SPEED)>>2;//Speedを読み込む
   //speedの上限と下限を設定
   if(dot_time <= 40){
     dot_time = 40;
   }else if(dot_time>= 200){
     dot_time = 200;
  }

   //DOTKEYが押されたかDot_flagが立っていれば、DOTとSPACEを送出する。
   if(digitalRead(DOTKEY)==LOW || Dot_flag==true){
     Dot_out();
     Dot_flag = false;//Dot_flagを下す
  }
   //DASHKEYが押されたかDash_flagが立っていれば、DASHとSPACEを送出する。
   if(digitalRead(DASHKEY)==LOW || Dash_flag==true){
     Dash_out();
     Dash_flag = false;//Dash_flagを下す
    }
}

void Space_out(){
   digitalWrite(TX,LOW);//TX off
   analogWrite(SIDETONE,0);//サイドトーンを出さない
   uint16_t c = dot_time;
   while(c){
     c--;
     delay(1);
    }
}

//Dotとspaceを送出
void Dot_out(){
   digitalWrite(TX,HIGH);//TX on
   analogWrite(SIDETONE,127);//サイドトーンを出す
   uint16_t c = dot_time;
   while(c){
     if(digitalRead(DASHKEY)==LOW){
       Dash_flag = true;
    }
       c--;
       delay(1);
  }
       Space_out();
}

//Dashとspaceを送出
void Dash_out(){
   digitalWrite(TX,HIGH);//TX on
   analogWrite(SIDETONE,127);//サイドトーンを出す
   uint16_t c =(dot_time <<1) + dot_time;
   while(c){
     if(digitalRead(DOTKEY)==LOW){
       Dot_flag = true;
    }
       c--;
       delay(1);
       }
       Space_out();
  }
-------------------------------------------
 ブレッドボードでテストしている様子です。
 サイドトーン用のPWMの周波数は約1000Hzです。
 ATtiny402は、結構力持ちでPWM出力ピンに直接スピーカーを接続するとかなり大きな音が出ます。音量の調節と出力電流を制限するため直列に300Ωの抵抗を入れています。


 テストなので、トランジスタはつけず、LEDと音で動作を確認しています。

 乾電池2本で動作させています。

 このエレキーの打ち心地は、普通のエレキーと同じで問題なく使えます。
 自作送信機に組み込むなどして使うと良いと思います。
 プログラムサイズは、フラッシュメモリが958バイト(23%)、RAMが14バイト(5%)です。ATtiny202でも十分組めるサイズです。

ずんねぇ ズッキーニだなぁ

2023-08-21 21:13:28 | 家庭菜園と花
 今年はほんとうに暑いです。連日猛暑が続いています。畑はカラカラです。

 毎日夕方に、花と畑に水やりをしています。今日も畑に水をやっていると足元に大きなズッキーニを発見しました。葉っぱの下で密かに大きくなっていました。



 長さは約30cmで、太いです。重さを測ったらなんど1.255kgありました。すごい!

 今年は、黄色いズッキーニと緑色のズッキーニを1本ずつ植えました。黄色の方は、なぜか途中で枯れてしまったのですが、緑の方は週に数本のペースで現在も収穫てきます。

 ズッキーニは、かぼちゃの仲間で地面を這うように伸びていきます。葉も大きく、その陰に隠れていて適当な大きさの時に採り逃してしまうとこんな風に大きくなることがあるんですよ。

ATtiny402 ロータリーエンコーダテスト

2023-08-20 11:15:42 | ATtiny
 ATtiny402でロータリーエンコーダーを使うテストをします。

 Arduino UNOなどでは、Rotary.hというライブラリを利用することができます。確認はしていないのですが、ライブラリでは割り込みを使っているのではと考えています。

 ATtiny402では、ピン状態割り込みが使えないようなので、割り込みを使わない方法でロータリーエンコーダの制御プログラムを組みました。このプログラムは「wsnakのブログ」のロータリーエンコーダの記事のプログラムを利用させていただきました。ありがとうございます。

 今回のテストでは、ロータリーエンコーダはAmazonで購入した安価なものを使い、ロータリーエンコーダの回転方向が時計回りの時にカウントアップ、反時計回りの時にカウントダウンするようにして、カウント値をLCD1602に表示するようにしました。

 テストした回路図です。ロータリーエンコーダのA端子をD0(PA6)にB端子をD1(PA7)に接続し、それぞれを10KΩでプルアップします。
 

 ロータリーエンコーダの回転方向の判定方法を簡単に説明します。
 下の図のように、ロータリーエンコーダのA,Bの値を読み取り、Aをbit1、Bをbit0としてCurDatの値に加えます。A,Bの値が変わったらCurDatの値を左に2ビットシフトし、A,Bの値を加えます。エンコーダの1クリックで、A,Bの値が4回変わりますので、その都度同じ操作をします。



 1クリックが終わったとき、エンコーダが時計回りの時、CurDatの値は0x4Bに、反時計回りの時は0x87になりますので、この値で回転方向が判定できます。

 スケッチです。
 機械的なロータリーエンコーダを使う場合、チャタリング対策が必要です。
 スケッチでは、その対策をソフトで行っています。ひとつは、入力が安定するまで1msのdelayを入れました。それから、入力が同じかどうかmatchCntでカウントして、2回以上一致したら処理するようにしています。wsnackさんは5回以上の一致を確認していますが、1msのdelayを入れたので2回で十分のようです。
---------------------------------------------------
/*
    ATtiny402 Rotary Encoder test
    2023.8.19
    JH7UBC Keiji Hata
*/

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);

//Rotary Encoder関係定義
#define REA 0 //D0
#define REB 1 //D1
byte curDat;
byte befDat = 0;
byte rotDir = 0;
int Count = 0;
byte inputMatch;
byte matchCnt;
byte rotPat = 0;

void setup() {
   pinMode(REA, INPUT);
   pinMode(REB, INPUT);
  //ロータリーエンコーダ初期値設定
   curDat = 0;
   if(digitalRead(REA)){
     befDat |= 2;
  }
  if (digitalRead(REB)){
     befDat |= 1;
  }
   //LCD初期設定と初期画面表示
   lcd.init();
   lcd.backlight();
   lcd.clear();
   lcd.setCursor(0,0);
   lcd.print("Rotary Encoder");
   lcd.setCursor(0,1);
   lcd.print(Count);
}

//Rotary Encoderの回転方向判定
signed char CheckEnc(byte dat) {
   rotPat <<= 2;//左に2bitシフト
   rotPat |= (dat & 0x03);//datの下位2bitを加える
  if (rotPat == 0x4B) {
     return 1; //時計回り(CW))
  } else if (rotPat == 0x87) {
     return -1; //反時計回り(CCW)
  } else {
     return 0; //どちらでもない
  }
}

void loop() {
     signed char val;
     curDat = 0;
     if (digitalRead(REA)) {
       curDat |= 2;
    }
     if (digitalRead(REB)) {
       curDat |= 1;
    }
     if (befDat == curDat) {
       //befDatとcurDatが一致したときの処理
       if (!inputMatch) {
         matchCnt++;
         if (matchCnt >= 2) { //2回以上一致したらフラッグを立てる
           inputMatch = 1;
           val = CheckEnc(curDat);
           if (val != 0) {
             Count += val;
             lcd.setCursor(0, 1);
             lcd.print("    ");
             lcd.setCursor(0, 1);
             lcd.print(Count);
           }
         }
       }
    } else {
       //befDatとcuDatが一致しなかった時の処理
       delay(1);//1ms待つ(チャタリング対策)
       befDat = curDat;
       matchCnt = 0;
       inputMatch = 0;
    }
}
---------------------------------------------------
ブレッドボードです。ロータリーエンコーダを回すごとに科カウントアップ、カウントダウンされます。このプログラムは、クリックの取りこぼしも少なく、けっこう優秀です。



パソコンが壊れた その3 CPUの換装

2023-08-17 06:53:46 | パソコン
 壊れたパソコンHP Pavilion dv6 (2009年製)は、同じプロダクトナンバーの物をヤフオクで落札し、HDDからSSDへの換装、RAMの増設(4GBに)、OSをWindows10にクリーンインストールを行いました。更に液晶パネルを交換し、ほぼ新品同様になりました。

 最後の仕上げは、CPUの交換です。交換前のCPUは、AMD AthlonⅡ Dual Core M300 2.00GHzです。
 

 これを壊れたパソコンに装着していたAMD TurionⅡ Ultra Dual Core M600 2.40GHzに交換しました。

 AThlonⅡ,TurionⅡともにSocketS1(s1g3)で、TDP35Wですので、問題はありません。しかし、CPUとACアダプターがかなり熱くなります。

 CPU換装の方法は、当ブログのこちらの記事を見てください。CPUを換装して立ち上げた時はCPUをTurionと認識しなかったのですが、少しして再起動されて無事下のように認識されました。



 このパソコンでは、CPUにアクセスできるようにするには、ほとんどのビスを外し、マザーボードを外さなくてはなりません。けっこう面倒です。

 これでパソコンの動きも少し良くなり快適に使えるようになりました。

パソコンが壊れた その2 液晶パネルの交換

2023-08-16 09:27:18 | パソコン
 壊れたHP Pavilion dv6 (2009年製)が一応Windows10で動作するようになりました。

 液晶パネルはの映りは問題ないのですが、フィルムの表面がガサガサの状態になっていました。そこで、壊れたパソコンの液晶パネルと交換することにしました。壊れたパソコンは2016年にもらった時に新品と交換しています。

 HP Pavilion dv6の液晶パネル交換の記事は、以前Yahooブログに記事を書いたのですが、Yahooブログ消滅と共に消えてしまいました。改めて記事を書きたいと思います。

 このパソコンの液晶パネル交換は、比較的簡単です。
 まず、下の図の丸印のところにあるネジを隠すプラスティックのカバーを取ります。


 カバーを取るとネジが見えます。これを左右両方とも外します。(白い丸印)



 次に液晶パネルを押さえているプラスティックの枠を外します。これは、パネルと枠の隙間に手を入れて広げると、パチッパチッという音とともに外すことができます。

 プラスティックの枠を外した状態です。



 液晶パネルを固定している4個のビスを外します。(黄色の丸印)

 パネルを外し、前に倒します。この時液晶画面を傷つけないようパネルとキーボードの間に布などを挟んでおきます。

 液晶パネルと本体を接続しているコネクタを外します。(黄色い丸印)
 コネクタから伸びているケーブルはパネルに接着されていますので、慎重に外します。(赤い丸印)

 以上で、液晶パネルを外すことができます。
 新しい液晶パネルと交換し、コネクタの接続、ケーブルの接着を行います。
 後は、外すときと逆に組み立てれば、交換完了です。

 きれいな液晶パネルになりました。映像の映りもよくなったように思います。