JH7UBCブログ

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

ドアを開けたら ヒキガエル

2023-09-20 22:15:02 | 自然観察
 今日は水曜日。毎週水曜日は、福島CW愛好会(FCWA)のHF交信会があります。今夜も21時から私がキー局で交信会を行いました。

 交信会を21時30分頃に終了し、母屋に戻るためシャックのドアを開けると見慣れない生き物がいました。こぶしほどの大きさのヒキガエルでした。写真を撮ろうと思って母屋からカメラを持ってきました。

 が、シャックのドアの付近にはカエルはいません。付近を懐中電灯を照らし捜索すると、いました、いました。





 大きさは10cm以上はあります。
 鼓膜が目の大きさより大きいので、東日本に生息しているアズマヒキガエルだと思います。

 我が家の畑や花の鉢には、アマガエルやツチガエルがたくさん棲んでいます。でもこんな大きいヒキガエルを見たのは初めてでした。

ATtiny402 OLED 表示テスト

2023-09-16 21:56:26 | ATtiny
 ATtiny402でOLEDの表示テストをします。
 OLEDは、秋月電子の0.96インチ128×64ドットのもので、コントローラは、SSD1306です。

 まず、Arduino UNOで<SSD1306AsciiAvrI2c.h >というライブラリで表示テストをしてみるとメモリを4KBほど使ってしまいました。ATtiny402ではこのライブラリでうまく表示できるかどうかもわからないので、ライブラリを使わないで表示テストをすることにしました。

 以前、PIC16F1827でOLEDの表示テストをしたことがあります。記事はこちら。この時のプログラムは、JR3TGS局の記事を参考にしてというかコピーさせていただいています。今回もコピーさせていただきました。(Arduino用に編集しました)また、フォントもコピーさせていただきました。ありがとうございます。

 回路図です。電源は、3V(電池2本)とし、FT-234のRXDとTXDだけを接続してUPDIでプログラムを書き込みます。


 OLEDはI2C接続用なので、SDAとSCLをPA1とPA2に接続します。I2C用のプルアップ抵抗はOLEDモジュールに内蔵されているのでつけていません。

 スケッチです。
 6x8dot用のフォントは、JR3TGS局の記事のものをfont6.hとし、12x16dot用のフォントはfont12.hとして、スケッチと同じフォルダに保存しておきます。

---------------------------------------------------------------------
/*
 * ATtiny402 OLED test
 * 2023.09.16
 * JH7UBC Keiji Hata
 */

#include <Wire.h>
#include "font6.h"
#include "font12.h"

uint8_t Page;
uint8_t Column;
uint8_t Low_col;
uint8_t Hi_col;
uint8_t Size;

//コマンド1bye送信
void oledCommand(uint8_t cmd){
   Wire.beginTransmission(0x3C);
   Wire.write(0x80);
   Wire.write(cmd);
   Wire.endTransmission();
}

//データ1byte送信
void oledData(uint8_t data){
   Wire.beginTransmission(0x3C);
   Wire.write(0xC0);
   Wire.write(data);
   Wire.endTransmission();
}

//OLED初期化
void oledInit(){
   oledCommand(0x8D); //Set charge pump
   oledCommand(0x14); //Enable charge pump
   oledCommand(0xAF); //Display ON
}

//OLED画面消去
void oledClear(){
   Wire.beginTransmission(0x3C);
   Wire.write(0x00);// Control byte Co=0, D/C#=0
   Wire.write(0x20);// Set memory addressing mode
   Wire.write(0x00);// Horizontal addressing mode
   Wire.write(0x21);// Set column address
   Wire.write(0x00);// Column start address 0
   Wire.write(0x7F);// Column end address 127d
   Wire.write(0x22);// Set page address
   Wire.write(0x00);// Page start address 0
   Wire.write(0x07);// Page end address 7d   
   Wire.endTransmission();
   for(int i=0;i<1024;i++){
     oledData(0x00);
  }
}

// 6x8dotフォントの表示開始位置指定
void font6_posi(uint8_t page, uint8_t column){
   uint8_t low_col;
   uint8_t hi_col;
   Size = 0; // printf で使用するputch のフォントサイズ指定
   Page = page; // ページ情報をfont12用にグローバル変数に保存しておく
   Column = column; // カラム情報をfont12用にグローバル変数に保存しておく
   page = page + 0xB0; // ページ情報をコマンドにする為に 0xB0 を加算
   low_col = column & 0x0F; 
   column = column >>4;
   hi_col = column + 0x10;
   Wire.beginTransmission(0x3C);
   Wire.write(0x00);// Control byte Co=0, D/C#=0
   Wire.write(0x20);// Set memory addressing mode
   Wire.write(0x02);// Page addressing mode
   Wire.write(page);// Set page start addres
   Wire.write(low_col);// Set lower column start address
   Wire.write(hi_col); // Set higher column start address
   Wire.endTransmission();
}

void font12_posi(uint8_t page, uint8_t column){
   uint8_t low_col;
   uint8_t hi_col;
   Size = 1; // printf で使用するputch のフォントサイズ指定
   Page = page;            // ページ情報をfont12用にグローバル変数に保存しておく
   Column = column;        // カラム情報をfont12用にグローバル変数に保存しておく
   page = page + 0xB0;     // ページ情報をコマンドにする為に 0xB0 を加算
   low_col = column & 0x0F;
   column = column >> 4;
   hi_col = column + 0x10;
   Wire.beginTransmission(0x3C);
   Wire.write(0x00);    // Control byte Co=0, D/C#=0
   Wire.write(0x20);    // Set memory addressing mode
   Wire.write(0x02);    // Page addressing mode
   Wire.write(page);    // Set page start addres
   Wire.write(low_col);// Set lower column start address
   Wire.write(hi_col);    // Set higher column start address
   Wire.endTransmission();
}

//6x8dotフォントの1文字表示
void chr6(uint8_t c){
   uint8_t i;
  c = c - 0x20;
   Wire.beginTransmission(0x3C);
   Wire.write(0x40);// Control byte Co=0, D/C#=1 (The following data bytes are stored at the GDDRAM)
   for(int i=0;i<6;i++){
     Wire.write(font6[c][i]);
  }
   Wire.endTransmission();
}

void chr12(uint8_t c)        // 12x16dotフォントの1文字表示関数
{
   uint8_t i;
   uint8_t temp;
  c = c + 6 - 0x30;
   Page = Page + 0xB0;
   Low_col = Column & 0x0F;
   temp = Column >> 4;
   Hi_col = temp + 0x10;
   Wire.beginTransmission(0x3C);
   Wire.write(0x00);    // Control byte Co=0, D/C#=0
   Wire.write(0x20);    // Set memory addressing mode
   Wire.write(0x02);    // Page addressing mode
   Wire.write(Page);    // Set page start addres
   Wire.write(Low_col);// Set lower column start address
   Wire.write(Hi_col);    // Set higher column start address
   Wire.endTransmission();
   Wire.beginTransmission(0x3C);
   Wire.write(0x40);    // Control byte Co=0, D/C#=1 (The following data bytes are stored at the GDDRAM)
      for(i=0; i<12; i++)
      {
          Wire.write(font12[c][i]);
      }
   Wire.endTransmission();
   Page = Page + 1;        // グローバル変数ペーシ情報 Page を次の lower 12bytes 描画の為に 1 進める
   Wire.beginTransmission(0x3C);
   Wire.write(0x00);    // Control byte Co=0, D/C#=0
   Wire.write(0x20);    // Set memory addressing mode
   Wire.write(0x02);    // Page addressing mode
   Wire.write(Page);    // Set page start addres
   Wire.write(Low_col);// Set lower column start address
   Wire.write(Hi_col);    // Set higher column start address
   Wire.endTransmission();

   Wire.beginTransmission(0x3C);
   Wire.write(0x40);    // Control byte Co=0, D/C#=1 (The following data bytes are stored at the GDDRAM)
   for(int i=12; i<24; i++){
       Wire.write(font12[c][i]);
  }
   Wire.endTransmission();
   Page = Page - 1 - 0xB0;    // グローバル変数ページ番号 Page を次の1文字描画の為、進めたページ番号を元に戻す (0xB0はコマンドをページ情報に戻す為)
   Column = Column + 12;    // グローバル変数カラム情報を次の次の1文字描画の為、12アドレス進める
}

//文字列表示
void printStr(char *s){
   while(*s){
     if(Size){
       chr12(*s++);
     }else{
       chr6(*s++);
    }
  }
}

void setup(){
   Wire.begin();
   oledInit();
   oledClear();
   font6_posi(0,20);
   printStr("Hello World!");
   font12_posi(3,0);
   printStr("0123456789");
}

void loop() {
}
---------------------------------------------------------------------
 このスケッチでフラッシュメモリ2828バイト(69%)、RAMは101バイト(39%)を使っています。

 フォントの表示開始位置は、下の図のようになります。


 ブレッドボードです。Page0,column20から6x8dotフォントで「Hello World!」が、Page3,column0から12x16フォントで「0123456789」を表示しました。



ATtiny402 AQM0802A表示テスト

2023-09-13 16:36:33 | ATtiny
 ATtiny402でI2C LCD AQM0802Aの表示テストをします。

 AQM0802Aは秋月電子で販売しているモジュールを使います。

 AQM0802Aの電源電圧は。3.3Vですので、ATtinyも3.3V(乾電池2本)で動作させることにします。

 テストの前に、ATtiny402がVDD=3.3V(乾電池2本)でUPDIで書き込めるかどうか試しました。下の回路図のように乾電池から電源を供給し、FT234からはTXDとRXDだけを利用してプログラムの書き込みができました。
 AQM0802AはATtiny402のPA1(SDA)とPA2(SCL)に接続します。I2Cのプルアップ抵抗は、AQM0802Aモジュールに内蔵されているのでつけていません。


 AQM0802A表示のライブラリはいくつかあります。
 FaBo 213 LCD mini AQM0802A と
 arduino_ST7032-master を試しましたが、コントラストの設定が悪いのかうまく表示しませんでした。それではとイニシャライズからプログラムを組んでみました。「NobのArduino日記!」のこちらの記事を参考にさせていただきました。ありがとうございました。

 テストしたスケッチです。1行目に文字列「JH7UBC」を表示し、2行目に数値を0から255まで1秒ごとにカウントアップします。
-----------------------------------------------------------------------------------
/*
 * ATtiny402 AQM0802A test
 * 2023.9.13
 * JH7UBC Keiji Hata
 */

 #include <Wire.h>
 bool zflag = true;

//コマンド書き込み
void writeCommand(byte com){
   Wire.beginTransmission(0x3E);
   Wire.write(0x00);
   Wire.write(com);
   Wire.endTransmission();
}

//データ書き込み
void writeData(byte data){
   Wire.beginTransmission(0x3E);
   Wire.write(0x40);
   Wire.write(data);
   Wire.endTransmission();
 }

 //カーソルセット
 void setCursor(byte x,byte y){
     if(y==0){
       writeCommand(0x80+x);
     }else if(y==1){
       writeCommand(0xC0+x);
    }
 }

//1文字表示
void printChar(char c){
   writeData((int)(c));
}

//文字列表示
void printStr(char *s){
   while(*s){
     printChar(*s++);
  }
}

//数字表示(0消しあり)
void printN(byte num){
   if(zflag==true){
     writeData(0x20);//space表示
   }else{
     writeData(num + 0x30);//ASCII code
  }
}

//数値表示
void printNum(int n){
   zflag = true;
   byte d2 = n / 100;
   if(d2 != 0)zflag=false;
   printN(d2);
   byte d1 = (n % 100)/10;
   if(d1 != 0)zflag=false;
   printN(d1);
   byte d0 = n % 10;
   writeData(d0 + 0x30);
}

void lcd_init(){
   writeCommand(0x38);//Function set
   writeCommand(0x39);//Function set
   writeCommand(0x14);//Internal OSC frequency
   writeCommand(0x73);//Contrast set
   writeCommand(0x56);//Power/ICON/Contrast control
   writeCommand(0x6C);//Fllower control
   delay(200);
   writeCommand(0x38);//Function set
   writeCommand(0x0C);//Display ON/OFF control
   writeCommand(0x01);//Clear display
   delay(1);
}

void setup() {
   Wire.begin();
   lcd_init();
   printStr("JH7UBC");
}

void loop() {
   for(int i=0;i<256;i++){
     setCursor(0,1);
     printNum(i);
     delay(1000);
  }
 }
----------------------------------------------------------------

 ATtiny402のクロックは16MHzとしてコンパイルしました。
 VDD=5Vの時は、Contrast setは0x7A、Power/ICON/Contrast controlは0x54とすればよいようです。
 このプログラムで、フラッシュメモリ1583バイト(38%)、RAMは98バイト(38%)を使っています。

ブレッドボードです。

 数値の表示は。強引に割り算と剰余を利用しています。もっとうまい方法があると思うのですが、今回はとりあえず3桁までの数値を表示するだけなので、この方法にしました。

全福島マラソンQSOの結果が発表されました

2023-09-12 09:18:25 | アマチュア無線
 7月25日(火)から31日(日)まで開催された第54回全福島マラソンQSOの結果が、JARL福島県支部のサイトに発表されました。結果は、こちら

 昨年と同じ参加局数でした。7MHzの参加局は多かったのですが、他のバンドは参加局が減少したようです。

 さて、当局JH7UBCはと見ると、見事3.5MHzで1位でした。でも参加局が当局だけですから、あまり喜べません。ちょっと寂しいですね。

 では、来年のマラソンQSOでまたお会いしましょう。

県北430CQ大会終了

2023-09-11 18:59:27 | アマチュア無線
 9月8日(金)18:00から10日(日)21:00まで開催された第33回県北430CQ大会が終了しました。

 当局JH7UBCは、3日間常置場所から参加しました。今回のコンテストの最初の交信はJI7GDH福島市移動の岡崎さんでした。岡崎さんは毎年精力的に移動運用をされます。最終交信は、埼玉県幸手市のJK1QDA局でした。3日間で33局と交信できました。交信いただいた各局ありがとうございました。

 毎年このコンテストでお会い出来る局、初めての局、様々でしたが今回印象に残ったのはJL7ROL局との交信でした。1999年以来なんと24年ぶりの交信でした。交信のなかで、高校生だったROL局が磐越物語号(SL列車)で移動していた時、私が当時住んでいた会津若松市から交信したことがわかりました。あー、そんなことがあったなと思い出しました。ROLがJA7YCSの後輩であることがわかったり、月日の流れを感じるとともに楽しい交信ができました。

 用事ができたりして十分な時間をコンテストに費やすことができませんでしたが、十分楽しめた430CQ大会になりました。