JH7UBCブログ

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

Arduino UNO R4 WiFi LEDマトリクス その1(動き回るLED)

2024-02-13 10:31:01 | Arduino
 Arduino UNO R4 WiFiの特徴の一つであるLEDマトリクスを使ってみます。

 ArduinoのサイトにLEDマトリックスの使い方の説明(チュートリアル)があります。Arduinoのサイトはこちら。これを和訳したサイトはこちら

 パターンやアニメの表示については、上記のサイトを参考にしてください。

 このようなLEDマトリクスを見ると、いずれスカッシュゲームを作ることができないかと考えてしまいます。そこで、第一段階として、LEDをボールに見立てて、壁にぶつかりながら動き回るボールを表示してみます。

 スケッチです。
-------------------------------------------------------------
#include "Arduino_LED_Matrix.h"

ArduinoLEDMatrix matrix;

void setup() {
matrix.begin();
}

uint8_t x = random(11);
uint8_t y = random(7);
uint8_t Dx = 1;
uint8_t Dy = 1;

uint8_t frame[8][12] = {
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};

void LED_on(uint8_t column,uint8_t row){
frame[row][column] = 1;
matrix.renderBitmap(frame, 8, 12);
}

void LED_off(uint8_t column,uint8_t row){
frame[row][column] = 0;
matrix.renderBitmap(frame, 8, 12);
}

void loop(){
LED_off(x,y);
  x = x + Dx;
  y = y + Dy;

if(x >= 11 || x <= 0){
    Dx = -Dx;
}

if(y >= 7 || y <= 0){
    Dy = -Dy;
}
LED_on(x,y);
delay(100);
}
-------------------------------------------------------------
100ms(0.1s)ごとに光るLEDが移動し、端っこで反射しながら動き回ります。



 動画でないので分かりにくいですが、光るLEDが次々に移動します。

TOP BAND コンテスト終了

2024-02-12 12:06:53 | アマチュア無線
 2月10日(土)21:00から11日(日)21:00まで、第40回KCJ TOP BANDコンテストが開催され、当局JH7UBCも参加しました。

 初日は、21:00から24:00まで参加しました。21:00になると各局一斉にCQを出し始めました。最初の30分は、呼び回りです。バンド(コンテスト指定周波数は1.801~1.820MHz)の下から上まで、1局ずつ拾っていきます。

 ここで、ちょっとしたトラブル。当局はロギングソフトにCTESTWINを使っていますが、パーシャルチェックを入れ間違えていたのです。かまわず、交信を続け、一段落したところでTOP BANDコンテスト用に入れ替えて、一安心。このパーシャルチェックがあると安心感が違います。

 CQランニングを始め、順調に交信していきました。コンテストの交信は、CTESTWINの操作だけで、パドル操作は必要ないのですが、ちょっと味気ないので、時々パドルでの送信も交えます。ところがパドルでの送信でミスタッチを乱発してしまいました。このところ縦振電鍵ばかり使っていてパドル操作がおぼつきません。各局にご迷惑をおかけしました。

 2日目は、18:30から21:00までオペレーションしました。2日目は初日と状況が変わります。CQを出している局は、ほとんど昨日交信した局です。Newの局を探すの苦労します。バンドを回り何局か交信を終えて、CQランニングを始めましたが、呼ばれることが少なくなりました。10回連続CQを出しても1回も呼ばれないことも多くなりました。我慢の時間帯です。

 このコンテストは、海外局との交信は2点になります。今回はロシア局3局と交信できました。他の国は参加しないのかな?

 最終的なスコアとマルチは昨年を若干上回ることができました。シャックから家に戻ってログをKCJサイトから送信しました。

 今年も無事このコンテストに参加できたことをうれしく思います。交信いただいた各局ありがとうございました。

今週末は、KCJ TOP BAND コンテスト

2024-02-08 18:33:57 | アマチュア無線
 今週末の2月10日(土)21:00から11日(日)21:00まで、第40回KCJ TOP BAND コンテストが開催されます。規約はこちら

 このコンテストは、トップバンド(1.9MHz帯)のCWモードのコンテストです。当局JH7UBCは、今年も参加する予定です。

 実際に使用される周波数は、1802KHz~1820KHz(1825KHz)で、この日ばかりは大いに賑わいます。ワッチするだけで面白いですよ。

 このバンドは、長いアンテナが必要なのですが、ロングワイヤー+ATUで運用している局もたくさんいます。各局、挑戦してみませんか。

 それでは、コンテスト当日お会いしましょう。


PIC16F18326 MCC FVRテスト

2024-02-08 13:35:50 | MPLAB X MCC
 PIC16F18326が内蔵しているFVR(Fixed Voltage Reference 低電圧リファレンス)のテストをします。

 FVRの構成です。(説明書より)

 bufferが2つあり、buffer1がADC用、buffer2がComperators and DAC用です。それぞれGainを1x,2x,4xに設定できます。

 今回はADC用のプラス電源としてFVRを利用してみます。
 テストする回路です。



 VDDをボリュームで調整して、その電圧をRC3からADCに入力し、変換値をI2C LCD1602に1secごとに表示します。

 プロジェクトを作成し、MCCを立ち上げ、各種設定を行います。
 systemモジュールです。デフォルトのままで、クロックは1MHzです。


 FVAR,ADC,MSSP1モジュールを導入して、それぞれ設定します。
 表示用にI2C LCD1602を使いますので、MSSP1モジュールをI2C Masterモードに設定します。



 ADCモジュールです。Result Alignmentをrightに、Positive ReferenceをFVRに設定します。



 FVRモジュールです。
 FVR_buffer1 Gainを4x 4.096Vに設定します。



 Interruputモジュールです。I2Cで割り込みを使います。



 pinモジュールです。
 ADCのinputはRC3に設定します。
 I2CのSCL1はRC0に、SDA1はRC1に設定します。


 以上の設定をして、Generateして、main.cのプログラムを次のように書きました。
------------------------------------------------
/*
 * PIC16F18326 MCC FVR test
 * 2024.02.08
 * JH7UBC Keiji Hata
*/

#include "mcc_generated_files/mcc.h"
#include "mcc_generated_files/examples/i2c1_master_example.h"

#define I2C_LCD_addr 0x27
#define LCD_EN 0b00000100//Enable
#define LCD_BL 0b00001000//Back Light
#define LCD_CMD 0x00
#define LCD_CHR 0x01
#define LCD_LINE1 0x80
#define LCD_LINE2 0xC0

//I2C LCDに1byteのdataを書き込む
void I2C_write_data(uint8_t data){
     I2C1_Write1ByteRegister(I2C_LCD_addr, (data | LCD_EN | LCD_BL),(data | LCD_BL));
     __delay_us(100);
}

//I2C LCDにコマンドまたは文字を送る
void LCD_write(uint8_t data, uint8_t mode){
     //上位4bitを送る
     I2C_write_data((data & 0xF0) | mode);
     //下位4bitを送る
     I2C_write_data(((data << 4) & 0xF0) | mode);
}

//I2C LCD 初期化
void LCD_init(){
     __delay_ms(40);
     LCD_write(0x33,LCD_CMD);//8bit mode set 2回
     LCD_write(0x32,LCD_CMD);//8bit mode set 1回,4bit mode set
     LCD_write(0x06,LCD_CMD);//Entry mode set
     LCD_write(0x0C,LCD_CMD);//display ON,cursor OFF,blink OFF
     LCD_write(0x28,LCD_CMD);//Function set 4bit mode,2line
     LCD_write(0x01,LCD_CMD);//Clear display
     __delay_ms(1);
}

void LCD_clear(){
     LCD_write(0x01,LCD_CMD);
     __delay_ms(1);
}

void LCD_home(){
     LCD_write(0x02,LCD_CMD);
     __delay_ms(1);
}

void LCD_cursor(uint8_t x,uint8_t y){
     if(y == 0){
     LCD_write(LCD_LINE1 + x,LCD_CMD);
    }
     if(y == 1){
         LCD_write(LCD_LINE2 + x,LCD_CMD);
    }
}

//文字列の表示
void LCD_str(char *str){
     while(*str)
     LCD_write(*str++,LCD_CHR); //pointer increment
}

//1文字表示
void putch(char ch){
     LCD_write(ch,LCD_CHR);
}


void main(void)
{
     // initialize the device
     SYSTEM_Initialize();

     // Enable the Global Interrupts
     INTERRUPT_GlobalInterruptEnable();

     // Enable the Peripheral Interrupts
     INTERRUPT_PeripheralInterruptEnable();
     LCD_init();
     printf("FVR & ADC TEST");
     LCD_cursor(12,1);

     int data = 0;

     while (1)
    {
      data = ADC_GetConversion(19);
      LCD_cursor(5,1);
      printf("%5d",data);
      __delay_ms(1000);
    }
}
------------------------------------------------
 putch()関数を定義して、printf()関数を使いますので、Project Propertiesの C standardは、C90に設定しました。

 ブレッドボードです。
 10kΩのボリュームを回すとその電圧に対してADCの値がLCDに表示されます。
 FVRのGainをx4に設定しましたので、電圧0~4.096Vの値がADCで変換されて0~1023の値で表示されます。
 写真では、4.10Vの時1023と表示しています。4.10V以上では1023のままです。


 FVRとADCを利用すれば、デジタル電圧計を作ることができます。
 ただし、ADCの変換値がけっこうふらつきますので、ノイズ対策と平均化などの対策が必要です。



PIC16F18326 MCC CLCテスト

2024-02-06 23:18:40 | MPLAB X MCC
 PIC16F18326のCLCのテストをします。

 CLC(Configuable Logic Cell)は、内蔵している下の図(いずれもmicrochipの説明書より)のロジックを設定により、プログラムとは関係なく使用できる機能です。これにより、高速の処理を行うことができます。


実際には、下のCLC BLOCK DIAGRAMで必要な設定をすることで使用可能になります。Logic Functionに上記のロジックのいずれかを設定します。



 CLCの入力は、次の中から選択します。


 microchipの説明書によれば、次のようなCLCの応用例が紹介されています。
• 応用例1: 位相検出器
• 応用例2: SCCP を入力とするデッドバンド制御を備
えた相補波形ジェネレータ
• 応用例3: 非同期のデータ信号モジュレータ(DSM)
• 応用例4: 複数パラメータの監視
• 応用例5: NRZ からRZ へのエンコード
• 応用例6: 2x1 マルチプレクサ

うーん、よく分かりません。とりあえず、どんな風に設定して使うのかWebで調べてみると、「はじめてのPIC & Arduino」というサイトにCLCを利用して、スイッチを押すとLEDが点灯するという記事を見つけたので、これをやってみることにしました。記事は、こちら。(ただし、PICはPIC16F1619が使用されています。 )

 さっそくプロジェクトを作成し、MCCを起動して、設定を始めます。

 systemモジュールです。デフォルトのままです。クロックは1MHzです。


 CLC1モジュールを導入しました。(CLC1からCLC4まで4つのCLCが使えます。)Mode、つまり使うLogic Functionは、AND-ORを選びます。
 下の論理回路をクリックして、入力はCLCIN0を1のOR回路に接続し、2のORの出力を反転させます。最後に出力を反転させます。



 次に、pinモジュールで、CLCの入力ピンと出力ピンを選択します。
 今回は、CLCIN0をRC4にCLC1OUTをRA4に設定しました。


 回路図です。RC4のPUSHスイッチを押すとRA4のLEDが点灯します。



 Generateして、build書き込みをしました。(ICSPでテストしています。電源は、PICKit3から供給しています。)

 プログラムには、次のように何も書かれていませんが、CLCは動作します。
------------------------------------------------------------
#include "mcc_generated_files/mcc.h"

void main(void)
{
     // initialize the device
     SYSTEM_Initialize();

     while (1)
    {
    }
}
---------------------------------------------------------------

 ブレッドボードです。スイッチを押すとLEDが点灯しました。



 最も簡単な回路で、CLCの動作を確認することができました。

 しかし、ここまで来るのに1週間ほどかかってしまいました。というのは、先述のサイトでは、CLCの出力をRA5としているので、私も最初はその設定でやってみました。
 ところが、ボタンを押してもLEDはつきません。何故?。
 CLCの設定やピンの設定、回路を見ても問題ありません。原因が分かりません。もんもんとして1週間が過ぎました。
 ひょっとして、RA5の出力設定がダメなのかな、と思いRA5を使ったLチカをやってみると、案の定LEDが光りません。PICを替えてやっても光りません。他のピンでは、Lチカができました。
 どうも、RA5を出力に設定できていないようです。Webで探ってみるとRA5は外部ロックのINに設定されているらしい。

 CLCの出力先をRA4に変更してみると、問題なく動作しました。ちょっとしたことで沼にはまってしまったわけです。

 このCLC機能をアマチュア無線で何かに利用できないか、今後考えていきたいと思います。