いよいよ、計画を進めよう・・・
準備編として
構成を考える・・・
1.バリコン:330pF
2.コイル :1.5~1.7μH
7MHz付近を330pFだと、1.5μH
塩ビパイプ(VP16)22mmx50mm
0.4mmエナメル線
T5で1.4~1.5μHになった。

このコイルとバリコン330pFで
2SK241で発振回路を作ってみたが
うまく発振しない・・・
見直し・・・
つづく

いよいよ、計画を進めよう・・・
準備編として
構成を考える・・・
1.バリコン:330pF
2.コイル :1.5~1.7μH
7MHz付近を330pFだと、1.5μH
塩ビパイプ(VP16)22mmx50mm
0.4mmエナメル線
T5で1.4~1.5μHになった。

このコイルとバリコン330pFで
2SK241で発振回路を作ってみたが
うまく発振しない・・・
見直し・・・
つづく

手持ちのSSD1306(i2c)の発色状態やアドレスを調べるために
作ったツールです。

アドレス:0x3Cと出て
全体的に文字を表示して色の確認

| No | 部品名 | 補足 |
| 1 | ATTiny85 | 16MHz(int) |
| 2 | スイッチ | スライド |
| 3 | 電池ボックス | |
| 4 | CR2032 | |
| 5 | ブレッドボード | |
| 6 | 配線 | 適当 |
| 7 | SD1306 OLED 128×64 i2c | テスト対象 |
0.96インチ 128×64ドット有機ELディスプレイ(OLED) 白色: オプトエレクトロニクス 秋月電子通商-電子部品・ネット通販
Amazon.co.jp: ARCELI 0.96インチOLEDモジュール12864 128×64 青と白のSSD1306ドライブ I2Cシリアルポート自発光ディスプレイボード : パソコン・周辺機器
いくつかの色で出ている
青・黄+青・白・・・
OLED
(Organic Light Emitting Diode)と呼ばれる有機ELディスプレイ
焼きつくと、だんだん表示が薄くなっていくので注意
ATTiny85
AVRマイコン ATTINY85-20PU: 半導体 秋月電子通商-電子部品・ネット通販


折角なので、ソースは以下、回路図は簡単なので省略(ソース内に接続図)
#include <TinyWireM.h>
#include "#include <TinyWireM.h>
#include "TinySSD1306.h"
/*
========================================================
ATtiny85 ←→ SSD1306 (I2C) 接続図
========================================================
ATtiny85 (8pin DIP)
┌─────────────┐
PB5 ──┤1 8├── VCC
PB3 ──┤2 7├── PB2 (SCL)
PB4 ──┤3 6├── PB1
GND ──┤4 5├── PB0 (SDA)
└─────────────┘
SSD1306 (I2C)
┌───────────────┐
│ GND → GND │
│ VCC → VCC │
│ SCL → PB2 │
│ SDA → PB0 │
└───────────────┘
========================================================
クロック: 16MHz (PLL) または 8MHz 内蔵
ライブラリ: TinyWireM + TinySSD1306.h
RAM使用量: 約40〜50バイト(ATtiny85で安全)
========================================================
*/
// OLED インスタンス(初期値は 0x3C)
TinySSD1306 oled(0x3C);
// I2Cデバイスをスキャンして最初に応答したアドレスを返す
uint8_t scanI2C() {
for (uint8_t addr = 1; addr < 127; addr++) {
TinyWireM.beginTransmission(addr);
if (TinyWireM.endTransmission() == 0) {
return addr;
}
}
return 0; // 見つからない
}
void setup() {
TinyWireM.begin();
// OLED の I2C アドレス自動検出
uint8_t addr = scanI2C();
if (addr == 0) {
// OLED が見つからない場合は停止
for (;;) {}
}
oled.setAddress(addr);
oled.init();
delay(50);
oled.setCursor(0, 0);
for (uint8_t page = 0; page < 8; page++) {
oled.setCursor(0, page);
for (uint8_t col = 0; col < 128; col++) {
TinyWireM.beginTransmission(addr);
TinyWireM.write(0x40);
TinyWireM.write(0x00);
TinyWireM.endTransmission();
}
}
// ---- 表示 ----
oled.setCursor(0, 0);
oled.print("SSD1306 Tester");
oled.setCursor(0, 1);
oled.print("ATtiny85 OK");
oled.setCursor(0, 2); // ここが重要
oled.print("I2C Addr: 0x");
oled.setCursor(80, 2); // ← ここで位置を固定する
oled.drawChar("0123456789ABCDEF"[(addr >> 4) & 0xF]);
oled.drawChar("0123456789ABCDEF"[addr & 0xF]);
oled.setCursor(0, 3);
oled.print("BUNCHAN747");
oled.setCursor(0, 4);
oled.print(" BUNCHAN747");
oled.setCursor(0, 5);
oled.print(" BUNCHAN747");
oled.setCursor(0, 6);
oled.print(" BUNCHAN747");
oled.setCursor(0, 7);
oled.print(" BUNCHAN747");
}
void loop() {
// テスターなので特に処理なし
}
TinySSD1306.h
#ifndef TINYSSD1306_H
#define TINYSSD1306_H
#include <TinyWireM.h>
#include <avr/pgmspace.h>
class TinySSD1306 {
public:
TinySSD1306(uint8_t addr) : _addr(addr) {}
void setAddress(uint8_t addr) { _addr = addr; }
void init() {
sendCommand(0xAE);
sendCommand(0xD5); sendCommand(0x80);
sendCommand(0xA8); sendCommand(0x3F);
sendCommand(0xD3); sendCommand(0x00);
sendCommand(0x40);
sendCommand(0x8D); sendCommand(0x14);
sendCommand(0x20); sendCommand(0x00);
sendCommand(0xA1);
sendCommand(0xC8);
sendCommand(0xDA); sendCommand(0x12);
sendCommand(0x81); sendCommand(0xCF);
sendCommand(0xD9); sendCommand(0xF1);
sendCommand(0xDB); sendCommand(0x40);
sendCommand(0xA4);
sendCommand(0xA6);
sendCommand(0xAF);
}
void setCursor(uint8_t col, uint8_t page) {
sendCommand(0x21); sendCommand(col); sendCommand(127);
sendCommand(0x22); sendCommand(page); sendCommand(page);
}
void drawChar(char c) {
if (c < 32 || c > 127) c = '?';
for (uint8_t i = 0; i < 5; i++) {
uint8_t line = pgm_read_byte(&font[c - 32][i]);
TinyWireM.beginTransmission(_addr);
TinyWireM.write(0x40);
TinyWireM.write(line);
TinyWireM.endTransmission();
}
TinyWireM.beginTransmission(_addr);
TinyWireM.write(0x40);
TinyWireM.write(0x00);
TinyWireM.endTransmission();
}
void print(const char *s) {
while (*s) drawChar(*s++);
}
private:
uint8_t _addr;
void sendCommand(uint8_t cmd) {
TinyWireM.beginTransmission(_addr);
TinyWireM.write(0x00);
TinyWireM.write(cmd);
TinyWireM.endTransmission();
}
public:
static const uint8_t font[96][5] PROGMEM;
};
#endif
// ====== フォント定義(PROGMEM版) ======
const uint8_t TinySSD1306::font[96][5] PROGMEM = {
{0x00,0x00,0x00,0x00,0x00}, // space
{0x00,0x00,0x5F,0x00,0x00}, // !
{0x00,0x07,0x00,0x07,0x00}, // "
{0x14,0x7F,0x14,0x7F,0x14}, // #
{0x24,0x2A,0x7F,0x2A,0x12}, // $
{0x23,0x13,0x08,0x64,0x62}, // %
{0x36,0x49,0x55,0x22,0x50}, // &
{0x00,0x05,0x03,0x00,0x00}, // '
{0x00,0x1C,0x22,0x41,0x00}, // (
{0x00,0x41,0x22,0x1C,0x00}, // )
{0x14,0x08,0x3E,0x08,0x14}, // *
{0x08,0x08,0x3E,0x08,0x08}, // +
{0x00,0x50,0x30,0x00,0x00}, // ,
{0x08,0x08,0x08,0x08,0x08}, // -
{0x00,0x60,0x60,0x00,0x00}, // .
{0x20,0x10,0x08,0x04,0x02}, // /
{0x3E,0x51,0x49,0x45,0x3E}, // 0
{0x00,0x42,0x7F,0x40,0x00}, // 1
{0x42,0x61,0x51,0x49,0x46}, // 2
{0x21,0x41,0x45,0x4B,0x31}, // 3
{0x18,0x14,0x12,0x7F,0x10}, // 4
{0x27,0x45,0x45,0x45,0x39}, // 5
{0x3C,0x4A,0x49,0x49,0x30}, // 6
{0x01,0x71,0x09,0x05,0x03}, // 7
{0x36,0x49,0x49,0x49,0x36}, // 8
{0x06,0x49,0x49,0x29,0x1E}, // 9
{0x00,0x36,0x36,0x00,0x00}, // :
{0x00,0x56,0x36,0x00,0x00}, // ;
{0x08,0x14,0x22,0x41,0x00}, // <
{0x14,0x14,0x14,0x14,0x14}, // =
{0x00,0x41,0x22,0x14,0x08}, // >
{0x02,0x01,0x51,0x09,0x06}, // ?
{0x32,0x49,0x79,0x41,0x3E}, // @
{0x7E,0x11,0x11,0x11,0x7E}, // A
{0x7F,0x49,0x49,0x49,0x36}, // B
{0x3E,0x41,0x41,0x41,0x22}, // C
{0x7F,0x41,0x41,0x22,0x1C}, // D
{0x7F,0x49,0x49,0x49,0x41}, // E
{0x7F,0x09,0x09,0x09,0x01}, // F
{0x3E,0x41,0x49,0x49,0x7A}, // G
{0x7F,0x08,0x08,0x08,0x7F}, // H
{0x00,0x41,0x7F,0x41,0x00}, // I
{0x20,0x40,0x41,0x3F,0x01}, // J
{0x7F,0x08,0x14,0x22,0x41}, // K
{0x7F,0x40,0x40,0x40,0x40}, // L
{0x7F,0x02,0x0C,0x02,0x7F}, // M
{0x7F,0x04,0x08,0x10,0x7F}, // N
{0x3E,0x41,0x41,0x41,0x3E}, // O
{0x7F,0x09,0x09,0x09,0x06}, // P
{0x3E,0x41,0x51,0x21,0x5E}, // Q
{0x7F,0x09,0x19,0x29,0x46}, // R
{0x46,0x49,0x49,0x49,0x31}, // S
{0x01,0x01,0x7F,0x01,0x01}, // T
{0x3F,0x40,0x40,0x40,0x3F}, // U
{0x1F,0x20,0x40,0x20,0x1F}, // V
{0x7F,0x20,0x18,0x20,0x7F}, // W
{0x63,0x14,0x08,0x14,0x63}, // X
{0x03,0x04,0x78,0x04,0x03}, // Y
{0x61,0x51,0x49,0x45,0x43}, // Z
{0x00,0x7F,0x41,0x41,0x00}, // [
{0x02,0x04,0x08,0x10,0x20}, // backslash
{0x00,0x41,0x41,0x7F,0x00}, // ]
{0x04,0x02,0x01,0x02,0x04}, // ^
{0x40,0x40,0x40,0x40,0x40}, // _
{0x00,0x01,0x02,0x04,0x00}, // `
{0x20,0x54,0x54,0x54,0x78}, // a
{0x7F,0x48,0x44,0x44,0x38}, // b
{0x38,0x44,0x44,0x44,0x20}, // c
{0x38,0x44,0x44,0x48,0x7F}, // d
{0x38,0x54,0x54,0x54,0x18}, // e
{0x08,0x7E,0x09,0x01,0x02}, // f
{0x08,0x14,0x54,0x54,0x3C}, // g
{0x7F,0x08,0x04,0x04,0x78}, // h
{0x00,0x44,0x7D,0x40,0x00}, // i
{0x20,0x40,0x44,0x3D,0x00}, // j
{0x7F,0x10,0x28,0x44,0x00}, // k
{0x00,0x41,0x7F,0x40,0x00}, // l
{0x7C,0x04,0x18,0x04,0x7C}, // m
{0x7C,0x08,0x04,0x04,0x78}, // n
{0x38,0x44,0x44,0x44,0x38}, // o
{0x7C,0x14,0x14,0x14,0x08}, // p
{0x08,0x14,0x14,0x18,0x7C}, // q
{0x7C,0x08,0x04,0x04,0x08}, // r
{0x48,0x54,0x54,0x54,0x20}, // s
{0x04,0x3F,0x44,0x40,0x20}, // t
{0x3C,0x40,0x40,0x20,0x7C}, // u
{0x1C,0x20,0x40,0x20,0x1C}, // v
{0x3C,0x40,0x30,0x40,0x3C}, // w
{0x44,0x28,0x10,0x28,0x44}, // x
{0x0C,0x50,0x50,0x50,0x3C}, // y
{0x44,0x64,0x54,0x4C,0x44}, // z
{0x00,0x08,0x36,0x41,0x00}, // {
{0x00,0x00,0x7F,0x00,0x00}, // |
{0x00,0x41,0x36,0x08,0x00}, // }
{0x08,0x04,0x08,0x10,0x08} // ~
};
あるサイトで見つけた、これまたTinyJoyPadのコピー品
www.tinyjoypad.com – TINYJOYPAD_ATTINY85
【Arduino】ATtiny85を使ったミニゲーム機『Tiny Joypad』をブレッドボードで組んで遊んでみる! | ぶらり@web走り書き
ATTiny85 で動くレトロゲーム機を作ってみた – ブログだいちゃん
これらは、TinyJoyPadの派生なんだが、少しづつアレンジされている。
結局は、Gameのソース次第なんだが・・・
基板はどえらい前に入手していたのだが、作る暇が・・・
シルバーウィークなので、電子工作日和・・・
部品をそろえて、はんだ付け開始!

手持ちの抵抗だったので、大きさが・・・
さっそくATTiny85にプログラムを書き込む・・・前回のUSBaspで

無事に動きました。
本日の午前中の電子工作だ
次は何作ろうか・・・
つづく