JH7UBCブログ

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

IC-756PROのボタン電池交換

2021-02-26 14:28:30 | アマチュア無線
 当局のメインリグIC-756PROの時計が、昨年の秋ごろか狂うようになってきました。内蔵の電池が消耗したのだと思い、交換することにしました。このリグは、約20年前に購入したものです。

 取説を見ると、電池は、リチウム電池CR2032で、裏蓋を外せば簡単に交換できるようです。

 裏蓋のビス6本を外します。(丸印)
 しかし、これでは外れません。更に側面のビス4本を外します。(矢印)


 これで、裏蓋を外すことができました。


 右上(黄色い丸印)にボタン電池が見えます。


 この電池を新品のCR2032と交換して、蓋を元通りに戻して、交換終了。

 電源を入れると、表示された時計は、正常に動作しました。

 取り出した電池は、中央部分が膨らんでいます。電圧は、0.2Vほどしかありませんでした。でも、20年間よくもったものです。




KCJトップバンドコンテスト終了

2021-02-14 22:12:34 | アマチュア無線
 昨日2月13日(土)21:00から本日14日(日)21:00まで開催された第37回KCJトップバンドコンテストが終了しました。

 当局JH7UBCは、今年も参加することができました。

 このコンテストは、CWモードのみのコンテストで、推奨周波数は、1.9MHz帯が、1908~1912KHzの4KHz、1.8MHz帯が1810~1820KHzの10KHzです。この狭い周波数範囲に多くの局がON AIRするわけですから、バンド内は蜂の巣をつついたようなにぎやかさになります。CQを出す周波数を見つけるのは至難の業です。Hi

 コンテスト開始後、今年もまず、1.9MHz帯の呼び回りから始めました。次に1.8MHz帯の呼び回りを行いました。わずか100KHzしか違わないのですが、この差が大きく影響します。当局のアンテナ短縮型のインバーテッドVの場合、1.9MHzはリグ内蔵のアンテナチューナーでなんとかマッチングがとれますが、1.8MHzでは、マッチングがとれません。昨年までは、1.8MHzで電波を出すことはあきらめていたのですが、今年はダメ元で1.8MHzでも電波を出してみました。すると、電波は弱いですがかろうじて拾ってもらえました。ラッキー。

 そんなわけで、今年は、1.9MHz帯と1.8MHz帯を行ったり来たりしての運用になりました。呼び回りの後は、なんとか空いている周波数を見つけて、CQランニングです。

 ところが、13日の23時過ぎに突然、ゆらゆらゆらと大きな地震がおきました。10年前の震災の時よりも時間は短かったのですが、かなり大きな揺れを感じました。これは大変、とコンテストを中断して、母屋に戻りテレビを見ると、福島県と宮城県で震度6強の大きな地震で、被害も出ている状態でした。
ということで、初日はこれで終了。

 14日は、18時半ころから20時50分まで、コンテストに参加しました。呼び回りとCQランニングを交互に行いました。QSBもあり、弱い局の信号を混信の中から聞き取るのはかなり神経を使う作業です。コンテストが終了したときは、心地よい疲れが残りました。

 交信いただいた各局ありがとうございました。

週末は、KCJトップバンドコンテスト

2021-02-11 13:44:39 | アマチュア無線
 今週末の2月13日(土)21:00~14日(日)21:00にKCJ主催のトップバンドコンテストが開催されます。規約は、こちら

 トップバンドとは、1.9MHz帯のことで、波長が160mですから、ダイポールで80m、1/4λで40mのアンテナになります。短縮型でもけっこうな長さになり、都会のハムには、ちょっと敷居の高いバンドですね。

 当局は、3.5MHzのフルサイズ、インバーテッドVアンテナにの両端にトラップを入れ、エレメントを数m延長して、1.9MHzにQRVしています。このアンテナで2019年から、このコンテストに参加しています。

 今年もこのコンテストに参加して、トップバンドでのCW交信を楽しみたいと思っています。参加各局交信よろしくお願いします。

ESP32 ロータリーエンコーダーその2

2021-02-06 20:21:20 | ESP32
 約1年ぶりにESP32を取り出して、実験しました。

 昨年、ESP32でロータリーエンコーダーのテストをしました。この時は、ライブラリを使わず、自前のスケッチでテストを行いました。

 最近、Arduino Pro Miniで、Ben Buxton氏のライブラリ を使い、大変よく動作することを確認しましたので、ESP32でも氏のライブラリーを使ってテストしてみます。

 ライブラリは、GitHubからダウンロードできます。こちらからRotary-master.zipをダウンロードして、Arduino IDEのライブラリに登録します。 

  GPIO12とGPIO13を使ってテストします。回路図です。


 まず、割込みを使わない方法で、GitHubにも掲載されている方法で、テストしてみました。スケッチです。すべてのGPIOで利用可能で、プルアップは、ライブラリで行いますので、プルアップ抵抗は必要ありません。しかし、GPIO34,GPIO35,GPIO36,GPIO39は、入力専用で、プルアップ抵抗が必要です。
 ロータリーエンコーダーを時計回り(右回り)に回転させるとシリアルモニタに「Right」と反時計回り(左回り)に回転させると「Left」と表示されます。
--------------------------------------------------------------------------------------
#include<Rotary.h>
#define ENC_A 12
#define ENC_B 13

Rotary r = Rotary(ENC_A,ENC_B);

void setup() {
Serial.begin(9600);
r.begin();
}

void loop() {
unsigned char result = r.process();
if (result) {
Serial.println(result == DIR_CW ? "Right" : "Left");
}
}
--------------------------------------------------------------------------------------
 問題なく、動作しました。

 次に、ピン変化割込みを使う方法です。スケッチです。ESP32では、全てのGPIOで割込みが使用可能でので、Arduinoよりピン割り当ての自由度が大きくなります。
--------------------------------------------------------------------------------------
#include<Rotary.h>
#define ENC_A 12
#define ENC_B 13

Rotary r = Rotary(ENC_A,ENC_B);

void setup() {
r.begin();
Serial.begin(9600);
attachInterrupt(ENC_A,rotary_encoder,CHANGE);
attachInterrupt(ENC_B,rotary_encoder,CHANGE);
}

void loop() {
}

void rotary_encoder(){
unsigned char result = r.process();
if(result){
if(result == DIR_CW){
Serial.println("Right");
}else{
Serial.println("Left");
}
}
}
--------------------------------------------------------------------------------------
 これも問題なく動作しました。
 目的、ケースによって使い分けします。
 ライブラリを使うと簡単で良いですね。

PIC16F1827 AD9834DDS SG

2021-02-01 20:42:19 | PIC16F1827
 昨年試作したPIC16F1827 AD9834DDS 7MHz VFOを汎用化して、SG(Signal Generator)を作ってみました。

 回路図です。AD9834DDSの出力に簡単なバッファアンプをつけました。
また、ICSPでプログラムの変更ができるように、ロータリーエンコーダーの接続を変更しました。


 ケースは、以前周波数カウンタに使っていたものを流用しました。


 内部の様子です。


 出力は、最大で約12.5dBm(17.8mW)です。周波数設定範囲は、10Hz~約24MHzで、周波数STEPは、1MHz→100KHz→10KHz→1KHz→100Hz→10Hzを循環で変更できます。

 1MHzの出力波形です。


 参考までにXC8のソースリストを掲載します。
-----------------------------------------------------------------------------------------------------
/*
* File: main.c
* Author: JH7UBC Keiji Hata
* PIC16F1827_AD9834_SG
* Created on 2021/02/01
*/


#include <stdio.h>
#include <stdlib.h>
#include <xc.h>


// CONFIG1
#pragma config FOSC = INTOSC
#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config MCLRE = OFF
#pragma config CP = OFF
#pragma config CPD = OFF
#pragma config BOREN = ON
#pragma config CLKOUTEN = OFF
#pragma config IESO = OFF
#pragma config FCMEN = OFF


// CONFIG2
#pragma config WRT = OFF
#pragma config PLLEN = ON
#pragma config STVREN = ON
#pragma config BORV = HI
#pragma config LVP = OFF


#define _XTAL_FREQ 32000000 //クロック32MHz


//LCD関係定義
#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
#define LCD_addr 0x4E //0x27<<1


/* ロータリーエンコーダ関係定義*/
#define ECA RB2 //エンコーダA
#define ECB RB3 //エンコーダB
unsigned char EA;
unsigned char EB;
volatile unsigned char curDat;
volatile unsigned char befDat;
volatile signed char count= 0;


/* STEP関係設定 */
unsigned long Step = 1000000; //STEP初期値 1MHz
#define STEP_SW RB5


/* AD9834DDS関係定義 */
#define FSYNC RA0
#define SCLK RA1
#define SDATA RA2
unsigned long Freq = 1000000; //周波数初期値 1MHz
unsigned long Freq_old; //周波数の前の値

/* I2C 初期化*/
void I2C_init(){
SSP1CON1 = 0x28; //SSPEN = 1,I2C Master Mode
SSP1STATbits.SMP = 1; //標準速度モード(100KHz)
SSP1ADD = 0x4F; //Fosc/(4*Clock)-1 Clock=100kHz,Fosc=32MHz
}


/* スタートコンディション */
void I2C_start(){
SSP1CON2bits.SEN = 1;
while(SSP1CON2bits.SEN);
}


/* ストップコンディション */
void I2C_stop(){
SSP1IF = 0;
SSP1CON2bits.PEN = 1;
while(SSP1CON2bits.PEN);
SSP1IF = 0;
}


/* I2Cに1byte送信 */
void I2C_write(unsigned char dat){
SSP1IF = 0;
SSP1BUF = dat;
while(!SSP1IF);
}


void Write_data(unsigned char data){
I2C_start();
I2C_write(LCD_addr);
I2C_write(data | LCD_EN | LCD_BL);
I2C_write(data | LCD_BL);
I2C_stop();
__delay_us(100);
}


void LCD_write(unsigned char bits,unsigned char mode){
//send High 4bits
Write_data((bits & 0xF0) | mode);
//send Low 4bits
Write_data(((bits << 4) & 0xF0) | mode);
}
void LCD_init(){
LCD_write(0x33,LCD_CMD);
LCD_write(0x32,LCD_CMD);
LCD_write(0x06,LCD_CMD);
LCD_write(0x0C,LCD_CMD);
LCD_write(0x28,LCD_CMD);
LCD_write(0x01,LCD_CMD);
__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(unsigned char x,unsigned char y){
if (y == 0){
LCD_write(LCD_LINE1+x,LCD_CMD);
}
if (y == 1){
LCD_write(LCD_LINE2+x,LCD_CMD);
}
}


void putch(unsigned char ch){
LCD_write(ch,LCD_CHR);
}


void Freq_disp(unsigned long frequency){
LCD_cursor(4,0);
printf("%8ld",frequency);
}


void Step_disp(unsigned long stp){
LCD_cursor(5,1);
printf("%7ld",stp);
}


void Step_change(){
__delay_ms(5);
if(Step == 10){
Step = 1000000;
}else{
Step = Step/10;
}
Step_disp(Step);
while(!STEP_SW){
__delay_ms(5);
}
}


/* AD9834DDSに16ビット送信 */
void Data_send(unsigned long data){
for(unsigned char i = 0;i<16;i++){
if(data & 0x8000){
SDATA = 1;
}else{
SDATA = 0;
}
__delay_us(1);
SCLK = 0;
__delay_us(1);
SCLK = 1;
data <<= 1;
}
}


/* AD9834DDSに周波数データを送る */
void Fnc_DDS(unsigned long frequency){
unsigned long wrk = frequency << 2;
unsigned int wrk1,wrk2,wrk3;

wrk1 = 0x2000; //コントロールワード
wrk2 = wrk & 0x3fff; //周波数データ下位
wrk2 = wrk2 | 0x4000;
wrk3 = wrk >> 14;
wrk3 = wrk3 & 0x3fff; //周波数データ上位
wrk3 = wrk3 | 0x4000;
SCLK = 1;
FSYNC = 0;
Data_send(wrk1);
Data_send(wrk2);
Data_send(wrk3);
FSYNC = 1;
}

void interrupt isr(){
IOCIF = 0; //割り込みフラッグクリア
IOCBF2 = 0;
IOCBF3 = 0;
__delay_ms(2);
curDat = ECA + (ECB<<1);
if (befDat != curDat){
unsigned char d = ((befDat<<1)^curDat) & 3; //回転方向判定
if(d < 2){
count++;
}else{
count--;
}
befDat = curDat;
}
if(count >= 4){
Freq += Step;
count = 0;
}else if(count <= -4){
Freq -= Step;
count = 0;
}
}

void main(){
OSCCON = 0b01110000 ; // 内部クロック8MHz
ANSELA = 0b00000000 ; // AN0-AN4は使用しない
ANSELB = 0b00000000 ; // AN5-AN11は使用しない
TRISA = 0b00000000 ; // PORTAは全て出力(RA5は入力)
TRISB = 0b00111110 ; // RB1(SDA),RB2(REA),RB3(REB),RB4(SDA),RB5は入力他は出力
PORTA = 0b00000000 ; // PORTA初期化
PORTB = 0b00000000 ; // PORTB初期化
OPTION_REGbits.nWPUEN=0; // ウィークプルアップ許可
WPUB = 0b00101100; // RB2,RB3,RB5をプルアップ

/* IOC割り込み設定 */
IOCBN = 0b00001100; //RB2,RB3立下り割り込み設定
IOCBP = 0b00001100; //RB2,RB3立ち上がり割り込み設定
IOCIE = 1; //IOC割り込み許可
GIE = 1; //全割り込み許可

I2C_init(); //I2C初期化
LCD_init(); //LCD初期化

/* Roatry Encoder 初期値 */
EA = ECA;
EB = ECB;
befDat = EA + (EB<<1);

/* 初期表示と初期周波数設定 */
LCD_cursor(13,0);
printf("Hz");
Freq_disp(Freq);
Fnc_DDS(Freq);
LCD_cursor(0,1);
printf("STEP");
Step_disp(Step);

while(1){
if(STEP_SW == 0){
Step_change();
}
if(Freq != Freq_old){
Fnc_DDS(Freq);
Freq_disp(Freq);
Freq_old = Freq;
}
}
}