2020年7月23日 (木)

ZK-80で足し算

20200723

 ZK-80で足し算をやってみました。
Aレジスタに0x16を入れておいて,そこに0x24を加えます。んで,答(Aレジスタの内容)は8010番地に書き込みましょう。

電子ブロック工房さんの JavaScript Z80 tiny assembler を使うと便利です。

8000: LD A,16          3E 16
8002: ADD A,24        C6 24
8004: LD (8010),A    32 10 80
8007: RET                C9 

 下の動画のように,パチパチ入力してRUNすると,8010番地に答の0x3Aが書き込まれてるのが確認できます。そうか,42年前に僕の友人はこういうことをやって遊んでたのか。
なんとなく活動記録。さんのところからリンクされてる 8080の命令セットの説明書をちゃんと読んで勉強してみようかな。

| | コメント (0)

2020年7月21日 (火)

TK-80互換機 ZK-80のキット

20200721-zk80

 1976年に発売されて大ヒットしたマイコンTK-80の互換機ZK-80のキットをaitendoで買って組み立ててみました。
TK-80は工学部電気電子系へ進学した友人の間では流行ってましたが,僕は全然関心がありませんでした。で,まったくニーモニックや機械語に触れることもなく大学時代を過ごし,就職後に初めて買ったコンピュータ(FM-8)で覚えた言語はBASICでした。
 定年退職後ヒマだし,aitendoの「ミニ版ZK-80組立てキット」は2,500円というリーズナブルなお値段なので,つい手が出てしまったというわけです。

 キットとしては部品点数も少ないし,あっという間にでき上がったのでネットで拾ったプログラムをパチパチ入力してるときに「あれ?4桁LEDのアドレス表示部とデータ表示部が逆だぞ」と気づきました。
回路を設計したピコソフト(株)のWebサイトのFAQを見てみたらその答えがありました。
「4桁LEDは二つ使用していますが,片方はアノードコモン,他方はカソードコモンで別物です。説明書にあるように,アドレス表示部にはアノードコモンのLED,データ表示部にはカソードコモンのLEDを付けてください。」

「うわ,そうだったのか! 気づかなかったー!」
逆に取り付ける確率は50%ですが,やらかしました。さあここからが大変。ハンダ吸取線や吸取器を使って悪戦苦闘すること30分。やっと取り外しに成功して正しい位置に付け直しました。
 しかし,電源を入れてみると7セグLEDのセグメントのひとつが点灯しません。取り外すときに基板のパターンを剥がしてしまったようです。回路図を見ながらテスターで調べ,切れてるっぽい箇所を見つけて配線。7セグLEDも無事点灯して,やっと完成です。
さっきのプログラムを入力してRUNすると,ちゃんと動いてるみたいです。やれやれ。

 ところが,また不具合発見。一番右上のRESETボタンが効かないのです。基板の表を見ても裏を見ても,このスイッチはどこにもつながってません。aitendoのキットの基板はこういうミスがよくあるんだよなあ。
回路図を見て,このスイッチはマイコンの1番ピン(MCLR)とGNDにつなぐことを確認して配線しました。この写真をごらんください ↓
20200721

 手間取りましたが,RESETボタンも効くようになってやっと完成! ↓ こんなサンプルプログラムがあらかじめ入ってました。

 

| | コメント (0)

2020年4月18日 (土)

Arduinoで作ろう(47) GPSモジュールで現在地の緯度・経度を取得

Esp32gps_

 aitendoで買ったGPSモジュールNEO-6MをESP32につないで。現在地を取得してみました。
TinyGPS++というライブラリを使うと,GPSモジュールから簡単に時刻,緯度(LAT),経度(LNG),標高(ALT)などを取り出すことができます。

20200418

 よく行くパソコンショップの駐車場にクルマを止めて,この装置で現在地を取得し,GoogleMapに緯度・経度を入力してみると正確に測位できていることが確認できました。これは普通にすごいな。

Gps_map

//ESP32 + GPSモジュール NEO-6M 

#include "TinyGPS++.h" //http://arduiniana.org/libraries/tinygpsplus/
#include "HardwareSerial.h"
#include "Wire.h"
#include "SSD1306.h"
SSD1306 display(0x3c, 21, 22); //I2Cアドレス0x3c,SDA->GPIO21,SCL->GPIO22
TinyGPSPlus gps;
HardwareSerial serial2(2); //ESP32_GPIO16->GPS_TX , ESP32_GPIO17->GPS_RX

void setup() {
  display.init();
  pinMode(2, OUTPUT);
  digitalWrite(2, LOW);
  Serial.begin(9600);
  Serial.println("Start GPS... ");
  display.clear();
  display.drawString(0,0,"Start GPS... ");
  display.display();
  serial2.begin(9600);
}

void loop() {
  if (serial2.available()){
   char c = serial2.read();
   gps.encode(c);
   if (gps.location.isUpdated()) {
    digitalWrite(2, HIGH);
    Serial.print("LAT: "); Serial.println(gps.location.lat(), 9);
    Serial.print("LONG: "); Serial.println(gps.location.lng(), 9);
    display.clear();
    display.drawString(0,0,String(gps.time.hour()+9)+":"+String(gps.time.minute())+":"+String(gps.time.second())+" JST");
    display.drawString(0,20,"LAT : "+String(gps.location.lat(),9));
    display.drawString(0,35,"LNG : "+String(gps.location.lng(),9));
    display.drawString(0,50,"ALT : "+String(gps.altitude.meters())+"m");
    display.display();
  } else{
    digitalWrite(2, LOW);
  }
 }
}

| | コメント (0)

2019年9月 9日 (月)

Arduinoで作ろう(33) 7セグLEDでデジタル時計 〈その2〉

20190909multi_function_shield

 以前 紹介したMulti Function Shieldで,7セグLEDデジタル時計を作ってみました。

Multifunctionshield_tokei_
 前回のシールドはシフトレジスタ74HC595が1個,7セグLEDはカソードコモンでしたが,今回のは74HC595が2個,7セグLEDはアノードコモンです。
どう配線されているかと言うと,こんな感じ↓

20190909

 桁選択用74HC595のSDOから数字表示用74HC595のSDIに配線されてますから,Shiftoutでデータを送るときは,数字表示用のデータを先に送らないといけません。
で,スケッチはこれです→ 20190908_ks0184_tokei.ino

/*
  Multi_function_shield
  RTC DS3231 7セグLEDデジタル時計
*/
#include <Wire.h>
#include <RtcDS3231.h>
RtcDS3231<TwoWire>
Rtc(Wire);
const int latch = 4;   // Latchピン
const int clock = 7;   // Clockピン
const int data = 8;   // Serial Data In ピン
const byte digit[] = //7seg 点灯パターン(アノードコモン)
{
  B11000000, // 数字 0
  B11111001, // 1
  B10100100, // 2
  B10110000, // 3
  B10011001, // 4
  B10010010, // 5
  B10000010, // 6
  B11011000, // 7
  B10000000, // 8
  B10010000  // 9
};

const byte segment[] =
{
  B00001000, //1桁め
  B00000100, //2桁め
  B00000010, //3桁め
  B00000001  //4桁め
};

void setup() {
  pinMode(latch, OUTPUT);
  pinMode(clock, OUTPUT);
  pinMode(data, OUTPUT);
  Rtc.Begin() ;
 // DS3231の日時を「それなりの値」に設定する場合に、以下の2行をコメントアウト
 // RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__) ;
 // Rtc.SetDateTime(compiled) ;
}

void loop() {
 RtcDateTime dt = Rtc.GetDateTime() ;
  Disp(3,dt.Hour()/10%10);
  Disp(2,dt.Hour()%10);
  Disp(1,dt.Minute()/10%10);
  Disp(0,dt.Minute()%10);
 }

void Disp(byte keta,byte value){
  digitalWrite(latch, LOW);
  shiftOut(data, clock, MSBFIRST,digit[value]);
    if (keta == 2) {
    shiftOut(data, clock, MSBFIRST, digit[value]&B01111111); //hhとmmの間に小数点をつける
    }
  shiftOut(data, clock, MSBFIRST, segment[keta]);
  digitalWrite(latch, HIGH);
  delay(4);
 }

20190908

| | コメント (0)

2019年9月 7日 (土)

Arduinoで作ろう(32) 7セグLEDでデジタル時計

Kcs1

 aitendoで買ったシールドで,このラーニングキットK-CS1ってのを忘れてました。
4桁7セグ表示器+74HC595ディスプレイ回路,温度センサインターフェース,クロックモジュールインターフェース,電圧メーター回路,タクトスイッチx2回路,超音波センサインターフェース,ブザー回路がついていて,学習用に便利なものです。
 今回はこれでデジタル時計を作ってみます。RTCはDS3231で,ライブラリはこれを使いました。

Fritzingで描いた回路図はこうなります。

7segled_tokei_2 シフトレジスタ74HC595があるので比較的ラクですが,スマートなコードはなかなかうまく書けませんなあ。もう少し勉強が必要ですね。

スケッチはこれ→20190907_7segled_clock.ino

// aitendoシールド K-CS1 + RTC DS3231 + 7セグLED デジタル時計

#include <Wire.h>
#include <RtcDS3231.h>
RtcDS3231<TwoWire>
Rtc(Wire);
const byte segment[] = {4,5,6,7}; //各桁カソードピン
const int clock = 10;   //74HC595 → Pin 10
const int latch = 9;    //74HC595 → Pin 9
const int data = 8;     //74HC595 → Pin 8
const byte digit[] =       //7セグLED 点灯パターン
{
  B00111111, //0
  B00000110, //1
  B01011011, //2
  B01001111, //3
  B01100110, //4
  B01101101, //5
  B01111101, //6
  B00000111, //7
  B01111111, //8
  B01101111  //9
};

void setup ()
 {
  for (int i = 0; i < 4; i++) {
  pinMode(segment[i], OUTPUT);
  }
  pinMode(latch, OUTPUT);
  pinMode(clock, OUTPUT);
  pinMode(data, OUTPUT);
  Rtc.Begin() ;
 // DS3231の日時を「それなりの値」に設定する場合に、以下の2行をコメントアウト
 // RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__) ;
 // Rtc.SetDateTime(compiled) ;
 }

void loop () {
  RtcDateTime dt = Rtc.GetDateTime() ;
  Disp(3,dt.Hour()/10%10);
  Disp(2,dt.Hour()%10);
  Disp(1,dt.Minute()/10%10);
  Disp(0,dt.Minute()%10);
 }

void Disp(byte keta,byte value){
  for (byte j = 0; j < 4; j++) {
   digitalWrite(segment[j], HIGH); // 全桁LEDをOFF
   }
  digitalWrite(segment[keta], LOW);
  digitalWrite(latch, LOW);
  shiftOut(data, clock, MSBFIRST,digit[value]);
   if (keta == 2) {
   shiftOut(data, clock, MSBFIRST, digit[value]|B10000000); //hhとmmの間に小数点をつける
   }
  digitalWrite(latch, HIGH);
  delay(4);
 }

Rimg0044

| | コメント (0)

2019年9月 5日 (木)

Arduinoで作ろう(31) ATtiny13をArduino IDEで使ってみる

 タイトルの「Arduinoで作ろう」からは少しズレてるような気もしますが,8ピンDIPの小さなAVRマイコンATtiny13をArduino IDEで使えるようにしてみました。

201909055

 まず,Arduino IDEのボード選択にATtiny13が出てくるようにしましょう。
そのために,まずArduino IDEの「環境設定」にある「追加のボードマネージャのURL」に https://kimio-kosaka.github.io/bitDuino13/package_bitDuino13_index.json を追加します。

Image11

 そうすると,「ツール」の「ボードマネージャ」の一番下に「bitDuino13」というパッケージが現れますから,これをインストールします。

Image12

 これで準備OK。「ツール」の「ボード選択」で一番下に「ATtiny13」が現れますから,これを選択します。

Image13

 さて,ここでaitendoのATtiny ISPシールドきっと の登場です。これはArduino UNOに取り付けるシールドで,各種ATtinyに対応したスグレモノです。ブレッドボード上で面倒な配線をしなくていいから便利ですよ。これはオススメ。

20190905

 この状態で,Arduinoで作ろう(28) に書いた手順でATtiny13にブートローダを書き込み,続けてスケッチを書き込んでやればOKです。
内部クロックは9.6MHzにしておきましょうか。(半端なクロック数ですな)

201909054

void setup() {
  pinMode(3, OUTPUT);
}
 
void loop() {
  digitalWrite(3, HIGH);
  delay(1000);
  digitalWrite(3, LOW);
  delay(1000);
}

こんな感じのLチカのスケッチを書き込んでみました。

201909052

| | コメント (0)

2019年9月 3日 (火)

Arduinoで作ろう(30) ATmega328Pを内部クロック8MHzで動かしてみた

  Arduino UNOや「あちゃんでいいの」などArduino互換機に載ってるATmega328Pは外付けXTAL(16MHz)で動いてますが,ATmega328Pは内部クロック(8MHz)を持ってるんだそうです。じゃ,その内部クロックで動かしてみようじゃないですか。

 そのために,まずこのページの真ん中あたりにある breadboard-1-6-x.zipをダウンロードし,解凍してできる「breadboard」というフォルダをArduino IDEがインストールされているフォルダの「hardware」フォルダ内に置きます。
Image00

 そうすると,Arduino IDEの「ツール」→「ボード」の中に「ATmega328 on a breadboard (8 MHz internal clock)」が現れるので,これを選びます。
Image01
 内部クロック8MHzで動かしたいATmega328(ターゲット)を「極貧ブートローダ書き込み機」に取りつけて,Arduino UNO(ArduinoISPを書き込んだAVRライタ)に載せ,ブートローダを書き込みます。

20190901

Image02

これで,内部クロック8MHzで動くATmega328Pのできあがりです。

 このまま続けてこのATmega328Pに「Blink」を書き込んでみます。書き込むときに「書込装置を使って書き込む」を選ぶのがポイントです。

Image03

「極貧ブートローダ書き込み機」から「Blinkを書き込んだ内部クロック8MHzで動くAtmega328P」を取り外し,ブレッドボードに載せて配線します。

20190831

おお,うまくいきました🎵

| | コメント (0)

2019年9月 1日 (日)

Arduinoで作ろう(29) 「あちゃんでいいの」にスケッチを書き込んでみた

20190827

 前回ブートローダを書き込んだATmega328Pをあちゃんでいいのに取り付けて,スケッチを書き込んでみます。
ま,スケッチ例「Blink」でいいかな。
あちゃんでいいの と USB-シリアルコンバータモジュールを接続して,パソコンに繋ぎましょう。このモジュールはCH340を積んだこれなんだけど,老眼の僕にとってはハンダ付けが大変でした。ハズキルーペ必須ですw

  あちゃんでいいの 変換モジュール
 P (PROG_RESET)  DTR
 G (GND)  GND
 5 (5V)  5V
 R (RXD)  TXD
 T (TXD)  RXD

 上記の表のように接続しますが,ピンヘッダがこの順序通り並んでるので,両端にピンソケット(1×5)メスのついたケーブルがそのまんま使えます。こりゃいい。
Arduino IDE でスケッチを書き込むとき,「ボード」は「Arduino UNO」で大丈夫です。

201908271242

電池を電源にしてLチカしてみました。VCCは7ピン,GNDは8ピンです。

| | コメント (0)

2019年8月30日 (金)

Arduinoで作ろう(28) 生のATmega328Pにブートローダを書き込んでみた

Aitendo

 贔屓にしているaitendoで,あちゃんでいいの (177円),極貧ブートローダ書き込み機 (195円),USB-シリアルコンバータ (399円),AVRマイコン ATmega328P-PU (1個230円)を買いました。
「あちゃんでいいの」というのは最小構成のArduino UNO互換機なんだけど,ヘンなネーミングですなあ。「あちゃん」って何?

 で,この「あちゃんでいいの」で使うため,生のATmega328PにArduinoのブートローダを書き込むのが今回の目標です。もちろん,ブートローダ書き込み済みのAtmega328Pも売ってますが,お高いので(1個300円),自分で書き込もうというわけです。

 Arduino UNOをAVRライタとして使い,ブレッドボード上に置いたターゲットのATmega328Pとジャンパ線でつないで書き込む方法もあるのですが,「極貧ブートローダ書き込み機」という,素晴らしいミニシールドがあるので,コレを利用することにします。

◆ まずはArduino UNOをAVRライタとして使うための準備

 Arduino UNOをパソコンにつなぎ,Arduino IDEを起動して,スケッチ例から「ArduinoISP」を開いてUNOにアップロードします。

Image

 これで,Arduino UNOがAVRライタになりました。

◆ ブートローダの書き込み

Gokuhin

 ターゲットとなる生のATmega328Pを「極貧ブートローダ書き込み機」に取りつけて,AVRライタとなったUNOに載っけます。

UNOをパソコンにつなぎ,Arduino IDEのメニュー「ツール」→「書込装置」→「Arduino as ISP」とします。

Image1_20190826192501

 で,「ツール」→「ブートローダを書き込む」としてやれば,ターゲットにブートローダが書き込まれます。
このブートローダ書込済のATmega328Pを取り外して,「あちゃんでいいの」に取りつければ最小構成Arduino UNOの完成です!

次回は「あちゃんでいいの」にスケッチをアップロードしてみます。

| | コメント (0)

2019年8月28日 (水)

Arduinoで作ろう(27) OLED(有機EL)モジュールを使ってみる

Lm35dz_oled_2

ちょっと前にaitendoで買ったOLEDモジュールをI2Cで使ってみました。
現在は「取扱終了」になってますが,同じものがAmazonでも手に入るようです。
ライブラリは,ココでダウンロードできる u8glib ってのでいいみたい。
んで,スケッチ例「GraphicsTest」をArduino IDEで読み込んでみました。

//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_NO_ACK|U8G_I2C_OPT_FAST);

という行のコメント//を削除すればこのOLEDが使用可能になります。
精細なグラフィックが美しいですが,そのままではつまんないので,LM35DZで測定した温度をちょいちょい表示するようにしたのがコレです→20190828graphicstest.ino

温度表示だけでよければ,

//aitendo OLED(0.96/128x64 青色/I2C) [M096P4BL]

#include "U8glib.h"

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0 | U8G_I2C_OPT_NO_ACK | U8G_I2C_OPT_FAST);

float analogdata, temp;

void setup(void) {
  u8g.setColorIndex(1);         // pixel on
}

void loop(void) {
analogdata = analogRead(A0);
temp = ((5.0 * analogdata) / 1024) * 100;
  u8g.firstPage();
  do {
    u8g.setFont(u8g_font_unifont);
    u8g.drawStr(0,22,"Temp:");
    u8g.setPrintPos(40, 22);
    u8g.print(temp);
    u8g.drawStr(86,22,"C");
   
    u8g.drawStr(0,44,"Time:");
    u8g.setPrintPos(40, 44);
    u8g.print(millis() / 1000);
    u8g.drawStr(70,44,"sec");
  } while ( u8g.nextPage() );
}

とか書いてやればOKです。グラフィックを使ったオリジナルの作例は,ヒマなときに取り組んでみたいと思います。(いつのことになるやら・・・)

| | コメント (0)