「電子工作」カテゴリーアーカイブ

7MHzDC受信機:その1

いよいよ、計画を進めよう・・・

準備編として
構成を考える・・・

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で発振回路を作ってみたが
うまく発振しない・・・

見直し・・・

つづく

SSD1306Tester:ATtiny85

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

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

No部品名補足
1ATTiny8516MHz(int)
2スイッチスライド
3電池ボックス
4CR2032
5ブレッドボード
6配線適当
7SD1306 OLED 128×64 i2cテスト対象

0.96インチ 128×64ドット有機ELディスプレイ(OLED) 白色: オプトエレクトロニクス 秋月電子通商-電子部品・ネット通販

Amazon.co.jp: ARCELI 0.96インチOLEDモジュール12864 128×64 青と白のSSD1306ドライブ I2Cシリアルポート自発光ディスプレイボード : パソコン・周辺機器

Amazon.co.jp: ideaspark 0.96インチ OLED ディスプレイモジュール 保護ケース付き 128×64 SSD1306 4ピン はんだ付け済み Arduino Raspberry Pi対応(青) : 産業・研究開発用品

いくつかの色で出ている
青・黄+青・白・・・
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}  // ~
};

Attiny Game Console:ATTiny85

あるサイトで見つけた、これまたTinyJoyPadのコピー品

www.tinyjoypad.com – TINYJOYPAD_ATTINY85

【Arduino】ATtiny85を使ったミニゲーム機『Tiny Joypad』をブレッドボードで組んで遊んでみる! | ぶらり@web走り書き

ATTiny85 で動くレトロゲーム機を作ってみた – ブログだいちゃん

これらは、TinyJoyPadの派生なんだが、少しづつアレンジされている。

結局は、Gameのソース次第なんだが・・・

基板はどえらい前に入手していたのだが、作る暇が・・・

シルバーウィークなので、電子工作日和・・・

部品をそろえて、はんだ付け開始!

手持ちの抵抗だったので、大きさが・・・

さっそくATTiny85にプログラムを書き込む・・・前回のUSBaspで

無事に動きました。

本日の午前中の電子工作だ

次は何作ろうか・・・

つづく