JH7UBCブログ

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

A1 CLUB ストレートキーコンテストに参加

2021-10-31 21:32:17 | アマチュア無線
 今日開催された第6回A1 CLUB STRAIGHT KEY コンテストに参加しました。
 このコンテストは、縦振電鍵など単一接点のキーを使うユニークなコンテストです。

 今回は、コンテスト前にちょっと出かけたので、16時頃から約1時間遅れでの参加になりました。
 まずは、7MHzから始めました。コンディションはまずまずですが、出遅れのため、あまり局数が稼げませんでした。

 17時30分頃、早々に3.5MzにQSYしました。こちらもコンディションはまずまずというところ。キーをたたき続け、21時まで頑張りましたが昨年のスコアには達しませんでした。

 今回も電鍵は、HK808を使いましたが、バネを少し弱めに調整して、打ち心地を軽めにしました。ということで、あまり力を入れずに電鍵を打つことができ、疲労感はあまりありませんでした。今年も縦振電鍵での交信を存分に楽しみました。交信いただいた各局ありがとうございました。

今日の畑

2021-10-28 20:00:02 | 家庭菜園と花
 10月28日、日増しに秋が深まっていきます。

 今日の畑です。


 トマト、ナス、オクラが終わり、ピーマンとシシトウはまだ残してあります。

 一番奥に見えるのが、アスパラ菜で、今が収穫時です。

 手前にミズナとシュンギクがあり、収穫できます。

 そろそろ家庭菜園の季節が終わり、11月に入ったら、車のタイヤ交換、シャックの雪囲いをやり、冬ごもりの準備に入ります。

 そうそう、シャックの前においたプランターでサフランの花が咲きました。秋の陽だまりで咲く可憐な花です。


Raspberry Pi Pico MicroPythonのセットアップからLED点滅まで

2021-10-26 11:57:11 | Raspberry Pi Pico
 Raspberry Pi PicoへのMicro Pythonの導入については、ネット上にたくさんの記事があり、参考になりました。しかし、簡単にいくかなと思って作業を始めたのですが、思わぬところでひっかかり、LED点滅(Lチカ)ができるまで、半日もかかってしまいました。

 ということで、トラブルシューティングも含めて、丁寧に書いてみますなお、パソコンのOSはWindows10です

 まずは、本家のRaspberry Piのホームページを開きます。Raspberry Pi PicoのBOOT SELボタンを押しながらパソコンにUSBで接続すると、パソコンにはメモリデバイスRPI-RP2として認識されエクスプローラに下のような画面が表示されます。

 INDEX.HTMアイコンをクリックするとRaspberry Piのホームページが表示されます。
 赤丸印のMicroPython Getting started with MicroPythonをクリックします。



 MicroPythonのページに移動したら、下の方にDrag-and-Drop MicroPythonという記事があり、簡単なアニメーションがあり、下にPythonのセットアップの手順が書いてあります。

1 MicroPython.UF2ファイルをダウンロードします。(この記事を書いたときはrp2-pico-20210902-v1.17.uf2でしたが、逐次アップデートされると思います)このファイルはRaspberry Pi Pico上で動作するMicroPythonのファームウェアです。

2 Raspberry Pi PicoのBOOTSELボタンを押しながらパソコンにUSB接続します。

3 PI-RP2という名前のストレージ・デバイスとして認識されます。

4 ダウンロードしたUF2ファイルをドラッグアンドドロップします。PicoのフラッシュメモリにUF2ファイルが保存されると、先ほどの表示が消えて、Raspberry Pi PicoでMicroPythonが使える状態になります。

5 これで、Raspberry Pi PicoとパソコンがUSBシリアル通信で接続されてREPL(Real Event Print Loop)でMicroPythonのプログラミングが可能になります。

 次に、MicroPythonのプログラミングに使う、Python IDEとしてThonnyをダウンロード・インストールします。Thonnyのサイトは、こちら。右上の赤丸印(Windows)をクリックします。

 

 インストールが終わったら、Thonnyを立ち上げます。初期設定で言語は「日本語」にします。Thonny IDEの画面です。


 ネット上にあった、Pico本体上のLEDを点滅させるプログラムを書き、実行しましたが、shellウインドウにエラー表示され、動きません。PicoとThonny間の通信がうまくいっていないようです。画面右下の赤丸印の部分をクリックし、Configure interpreterをクリックして開きます。「インタプリタ」タブを開き、デバイスをMicroPython(Raspberry Pi Pico)に、PortをUSBシリアルデバイスのPicoが接続されているPortを指定します。

 これで、PicoとThonnyの通信ができるようになり、名前を付けて保存し、「実行」をクリックするとPico本体のLEDが点滅しました。

 では、次にGP15に接続したLEDを点滅させてみます。回路図です。
 プログラムです。

 このプログラムをmain.py(拡張子pyを付けます)という名前でPicoに保存するとPico単体(スタンドアローン)で動作することができます。つまり、PicoをUSB電源に接続するだけで動作させることができます。ブレッドボード上でGP15に接続したLEDが点滅している様子です。







 

Raspberry Pi Picoの勉強始めます

2021-10-25 17:11:15 | Raspberry Pi Pico
 巷で話題のRaspberry Pi Picoを先月秋月電子から購入しました。(550円)
 家庭菜園がそろそろ終わりになり、PICの方も一区切りしたので、Raspberry Pi Picoの勉強を始めることにしました。

 購入したRaspberry Pi Picoは、プラスチックのパッケージに入っていました。

 取り出して、手持ちのRaspberry Pi 3 ModelBと比べてみます。大きさの違いが分かりますね。

 このままでもテストには使えますが、20Pのピンヘッダをはんだ付けして、ブレッドボードにセットして使用することにします。今回は、ブレッドボードに刺しやすいように細ピンヘッダを取り付けました。


 これまで勉強してきた(使ってきた)1ボードマイコンと並べてみました。
 左から、ESP32,STM32,Raspberry Pi Pico,Arduino Nano,Arduino Pro Miniです。比べてみると中くらいの大きさですね。性能、機能的にはESP32とSTM32の中間ですが、価格が安いのが魅力ですね。


 開発言語としては、Python(Micro Python),C,C++が使えます。
 まずは、Web上に多くの情報があるMicro Pythonを使って勉強(テスト)していくことにします。

 次回は、最初の一歩、Lチカ(LEDの点滅)をやってみます。

 


PIC16F18326 MCC OLED表示テスト

2021-10-20 15:31:20 | MPLAB X MCC
PICでのOLED表示テストは、PIC16F1827を使って以前に行い、このブログに掲載しました。記事はこちら

今回は、秋月電子から購入したOLED(0.96インチ 128×64ドット 580円)を使い、PIC16F18326でMPLAB X + MCCの環境で表示テストを行いました。

PICとOLED間は、I2C通信でコントロールとデータ送信を行います。PIC16F18326の動作を確認するために、LEDをRA0に接続して点滅させます。電源は乾電池2個(3V)とします。OLEDモジュール内にプルアップ抵抗があるので、I2Cのプルアップ抵抗は省略しています。

回路図です。

プロジェクトを作成して、MCCを立ち上げます。System moduleの設定をします。HFINTOSC 32MHzとし、Clock Dividerは1とし、最高速で動作させています。Low-voltage programingのチェックを外します。
I2Cは、MSSP1モジュールを導入したので、10番ピン(RC0)がSCL1に、9番ピン(RC1)がSDA1になります。RA0はoutputに設定します。

pin moduleです。


MSSP1moduleです。I2C 100KHzに設定しました。

MCCのI2Cでは、割込みを使いますので、interrupt moduleを設定します。

さて、プログラミングですが、JR3TGS局のサイトに掲載されているものをMCC用に改良して使わせていただきました。フォントもそのまま使わせていただきました。ありがとうございました。

MCCでは、i2c1_master_example.c内にある次のI2C関係関数を利用します。
1バイト(8bit)のデータを送信する関数
I2C1_Write1ByteRegister(i2c1_address_t address, uint8_t reg, uint8_t data)
2バイト(16bit)のデータを送信する関数
I2C1_Write2ByteRegister(i2c1_address_t address, uint8_t reg, uint16_t data)
Nバイトのデータを送信する関数
I2C1_WriteNBytes(i2c1_address_t address, uint8_t* data, size_t len)

font6.hとfont12.hは、Header ファイルとして、プロジェクトのヘッダフォルダに保存します。

以下、プログラムです。
printf()関数を使っていますので、projectのpropertiesで、XC8 Global OptionsのC standerdをC90にしてコンパイルします。
-------------------------------------------------------------------------------
/*
* PIC26F18326 MCC OLED
* 2021.10.20
* JH7UBC Keiji Hata
*/

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

#define OLED_addr 0x3C

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

uint8_t CLR_cmd[] ={0x00,0x20,0x00,0x21,0x00,0x7F,0x22,0x00,0x07};
//コマンド連続送信,Horizontal addredding Mode,column start address,
//column end address,page start address,page end address
uint8_t Posi_cmd[] = {0x00,0x20,0x02,0xB0,0x00,0x00};
//コマンド連続送信,Page addressing Mode,Page(B0-B7),low column,high column)
uint8_t Font6_data[] = {0x40,0x00,0x00,0x00,0x00,0x00,0x00};
//データ連続送信,font6データ6個
uint8_t Font12_data[] = {0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
//データ連続送信,font12データ12個

//コマンド1byte送信
void OLED_cmd(uint8_t cmd){
I2C1_Write1ByteRegister(OLED_addr,0x80,cmd);
}

//データ1byte送信
void OLED_data(uint8_t dat){
I2C1_Write1ByteRegister(OLED_addr,0xC0,dat);
}

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

//OLED画面消去
void OLED_clr(){
I2C1_WriteNBytes(OLED_addr, CLR_cmd, 9);//Horizontal addressing mode
for(unsigned int i = 0;i < 1024 ;i++ ){ //0s00を1024個送信
OLED_data(0x00);
}
}

// 6x8dotフォントの表示開始位置指定
void font6_posi(uint8_t page, uint8_t column){
Size = 0; //printf で使用するputch のフォントサイズ指定
Page = page; // ページ情報をfont12用にグローバル変数に保存しておく
Column = column; // カラム情報をfont12用にグローバル変数に保存しておく
Posi_cmd[3] = 0xB0 + page; // ページ情報をコマンドにする為に 0xB0 を加算
Posi_cmd[4] = column & 0x0F; //low_column
column = column >>4;
Posi_cmd[5] = column + 0x10; //hi_column
I2C1_WriteNBytes(OLED_addr, Posi_cmd, 6); //Position コマンドをI2Cに送信
}

// 12x16dotフォントの表示開始位置指定
void font12_posi(uint8_t page,uint8_t column){
Size = 1; // printf で使用するputch のフォントサイズ指定
Page = page; // ページ情報をfont12用にグローバル変数に保存しておく
Column = column;// カラム情報をfont12用にグローバル変数に保存しておく
Posi_cmd[3] = page + 0xB0; // ページ情報をコマンドにする為に 0xB0 を加算
Posi_cmd[4] = column & 0x0F; //low_column
column = column >>4;
Posi_cmd[5] = column + 0x10; //hi_column
I2C1_WriteNBytes(OLED_addr, Posi_cmd, 6);
}

// 6x8dotフォントの1文字表示関数
void chr6(uint8_t c){
c = c - 0x20;
for(uint8_t i = 0; i<6; i++){
Font6_data[i+1] = font6[c][i];
}
I2C1_WriteNBytes(OLED_addr,Font6_data,7);
}

// 12x16dotフォントの1文字表示関数
void chr12(uint8_t c){
uint8_t temp;
uint8_t i;
c = c + 6 - 0x30;
Page = Page + 0xB0;
Low_col = Column & 0x0F;
temp = Column >> 4;
Hi_col = temp + 0x10;
Posi_cmd[3] = Page;
Posi_cmd[4] = Low_col;
Posi_cmd[5] = Hi_col;
I2C1_WriteNBytes(OLED_addr,Posi_cmd,6);
for(i = 0; i<12; i++){
Font12_data[i+1] = font12[c][i];
}
I2C1_WriteNBytes(OLED_addr,Font12_data,13);

Page = Page + 1;// グローバル変数ペーシ情報 Page を次の lower 12bytes 描画の為に 1 進める
Posi_cmd[3] = Page;
I2C1_WriteNBytes(OLED_addr,Posi_cmd,6);
for(i = 12; i<24; i++){
Font12_data[i-11] = font12[c][i];
}
I2C1_WriteNBytes(OLED_addr,Font12_data,13);
Page = Page - 1 - 0xB0;//グローバル変数ページ番号 Page を次の1文字描画の為、進めたページ番号を元に戻す (0xB0はコマンドをページ情報に戻す為)
Column = Column +12;// グローバル変数カラム情報を次の次の1文字描画の為、12アドレス進める
}

//printfで使用するputchの定義
void putch(uint8_t c){
if(Size){
chr12(c);
}else{
chr6(c);
}
}

void main(void)
{
// initialize the device
SYSTEM_Initialize();
// Enable the Global Interrupts
INTERRUPT_GlobalInterruptEnable();
// Enable the Peripheral Interrupts
INTERRUPT_PeripheralInterruptEnable();

OLED_init();
OLED_clr();

font6_posi(0,30);
printf("Hello World!");
font12_posi(2,0);
printf("0123456789");

while (1)
{
LATA0 = 1;
__delay_ms(500);
LATA0 = 0;
__delay_ms(500);
}
}

-------------------------------------------------------------------------------

ブレッドボードです。