HOME | Raspberry Pi | ビジネス書籍紹介 | 2021-09-19 (Sun) Today's Access : 131 Total : 354125. Since 10 Sep. 2019

DVD Player LED
2021.01.30

YouTube でも紹介しています。画像をクリックすると再生できます。

DVDプレーヤーからパーツ取りしたLEDを時計と温度表示に利用してみました。 Arduino でいかにスイッチのオン・オフをするのかがポイントです。

■ワイドFM対応の7インチポータブルDVDプレーヤー

パーツ取りしたのは、ダイニチ電子株式会社の DV-PF701X です。 赤枠で囲んであるパーツが今回使用する、DVD Player LED です。

12ピンのLEDです。

■参考サイトおよび動画

記事を作成するうえで、下記の情報を活用させていただきました。

TECHZONE - Arduino Clock with DVD Player LED Display

LEDの動作解析に関しては以下の動画を参考にしました。
DVD Player LED Display Recycling

動画の中にもピンの対応表がありますが、製品によって微妙にLEDのレイアウトが違います。

■動作解析


12本のピンから2本を選んで、総当たりでショートさせ、LEDが光る部分を確認していきます。 画像では、アノード(+)側に1KΩの抵抗を挟んでいます。
解析結果を表に纏めると、下図のようになります。

■開発環境


パソコンから、TeraTeamでラズパイにSSH接続、PlatformIOを用いてビルドします。
Arduino開発環境構築 PlatformIO

■配線 Arduino - DVD Player LED

Arduino Nano12111013
 
DVD Player LED101112



■コーディング解説

定数定義
int characterdata[10][7] = {
                 {1,1,1,1,1,1,0},
                 {0,1,1,0,0,0,0},
                 {1,1,0,1,1,0,1},
                 {1,1,1,1,0,0,1},
                 {0,1,1,0,0,1,1},
                 {1,0,1,1,0,1,1},
                 {1,0,1,1,1,1,1},
                 {1,1,1,0,0,0,0},
                 {1,1,1,1,1,1,1},
                 {1,1,1,1,0,1,1} };
int anode[7] = {4,5,6,13,2,3,7};
int cathode[5] = {12,11,10,9,8};
7セグメントLEDを使う際の定石的な定義です。 配列中の'1'は、該当するセグメントの点灯を指示します。 このパターンの組み合わせで、0~9を表示させます。
abcdefg
{1,1,1,1,1,1,},
{0,1,1,0,0,0,},
{1,1,0,1,1,0,},2
{1,1,1,1,0,0,},3
{0,1,1,0,0,1,},4
{1,0,1,1,0,1,},5
{1,0,1,1,1,1,},6
{1,1,1,0,0,0,},7
{1,1,1,1,1,1,},8
{1,1,1,1,0,1,}};9
anode[7]={4,5,6,13,2,3,};
セグメントのa,b,c・・・の並びに対応するように、Arduino側のピン配列を変更しています。

初期処理
void setup () { 

  for (int i=0;i<7;++i) {
    pinMode(anode[i], OUTPUT);
    digitalWrite(anode[i], LOW);
  }
  for (int i=0;i<5;++i) {
    pinMode(cathode[i], INPUT);
  }
}
アノード(+)用ピンのモードをOUTPUTに設定し、LOWで初期化します。
カソード(-)用ピンのモードをINPUTに設定します。

ループ処理
void loop () {
  drawDigit(0,5);
  drawDigit(1,4);
  drawColon();
  drawDigit(2,3);
  drawDigit(3,2);
}
ここでは、テスト的に上位の桁から5→4→:→3→2の順に表示を繰り返しています。

LED表示処理
void drawDigit(int pos, int num) {

  for (int i=0;i<5;++i) pinMode(cathode[i], INPUT);

  pinMode(cathode[pos+1], OUTPUT);
  digitalWrite(cathode[pos+1], 0);

  for (int i=0;i<7;++i) digitalWrite(anode[i], characterdata[num][i]);

  delay(500);
}
この赤線の箇所が肝になるところです。 カソード(-)のピンモードをOUTPUTにして、0(LOW)に設定します。 その後に点灯させたいセグメントのアノード(+)を1(HIGH)にします。
これにより、実際にはGND状態にあるカソードに電流が流れこみ、指定したセグメントが点灯します。
※危険:2つのI/OピンがともにOUTPUTモードで、片方がLOW、もう片方がHIGHでこの2つを直接繋ぐと、過電流が流れてArduinoを破損させてしまいます。
上記の回路ではアノード側の出力は1KΩの抵抗を介してLEDに接続されています。これにより、間違えてカソードに繋いだときの損傷も回避しています。

$ pio run -t upload


1桁ずつ表示されていますが、これを高速で切り替えることで、全桁が点灯してみえます。
void drawDigit(int pos, int num) {
  ・・・・
  delay(2);
}
■リアルアイムクロックDS1302/AHT10デジタル温湿度センサー

表示を確認できたところで、時刻と温度表示を行います。 ここでは、配線のみを記載しています。詳細な設定は、リンク先を参照してください。

Ref.DS1302 → 画像処理 第3回リアルタイムクロック
Arduino -  DS1302 
5V - [1]Vcc2 Power-Supply
GND - [4]GND
A2(16) - [5]CE
A1(15) - [6]I/O
A0(14) - [7]SCLK

Ref.AHT10 → Seeeduino XIAO
Arduino  - AHT10
A4/SDA - SDA
A5/SCK - SCL
GND  - GND
5V - Vin

■コテライザー 70Aセット20~80W相当 N70A

今年になって新調したガス式はんだゴテです。とても快適です。
コテライザー70
・ライター着火タイプ
・連続使用時間:120分
・付属コテ先:70-01-01
・全長(mm):243
・最高温度(℃):約500(はんだこて)/約630(ホットブロー)
・ガス充填量(ml):28
・電気はんだこて20~80W相当

お買い物はこちらです♡→コテライザー 70 (amazon)

■時計/温度表示装置完成


背面からみた様子です。上段が表示用基板、中段がArduino Nano と温湿度センサーになっています。 Arduino Nanoから,LED12ピン分の配線が延びています。

中段から下段のリアルタイムクロックへは5本の線でつながっています。

時刻と温度を自動的に切り替えて表示するようにしてあります。 右側に写っているのは、5V昇圧回路の基板です。乾電池に繋がっています。 割と電力を消費しますので、実際にはUSB給電がよいと思います。

■ソースコード

雑なコードですので、使用する際には好きなように編集してください。
#include <Adafruit_AHTX0.h>

Adafruit_AHTX0 aht;

//----  DS1302 definition ---------------------
#define PIN_CE    16
#define PIN_IO    15
#define PIN_SCLK 14

const uint8_t Sun = 1;
const uint8_t Mon = 2;
const uint8_t Tue = 3;
const uint8_t Wed = 4;
const uint8_t Thr = 5;
const uint8_t Fri = 6;
const uint8_t Sat = 7;

static char clockTime[13];
static char editTime[20];
static char shortTime[7];

static String  recv = "";
//----------------------------------------

int characterdata[10][7] = {
                                    {1,1,1,1,1,1,0},
                                    {0,1,1,0,0,0,0},
                                    {1,1,0,1,1,0,1},
                                    {1,1,1,1,0,0,1},
                                    {0,1,1,0,0,1,1},
                                    {1,0,1,1,0,1,1},
                                    {1,0,1,1,1,1,1},
                                    {1,1,1,0,0,0,0},
                                    {1,1,1,1,1,1,1},
                                    {1,1,1,1,0,1,1} };
int anode[7] = {4,5,6,13,2,3,7};
int cathode[5] = {12,11,10,9,8};
int digits[4];

// 整数値をBCDに変換
byte dec2bcd(int x) {
  return ((x/10)<<4)+(x%10);
}

uint8_t bcd2dec(const uint8_t bcd) {
	return (10*((bcd&0xF0)>>4)+(bcd&0x0F));
}

uint8_t shiftInEx() {
	uint8_t input_value=0;
	uint8_t bit=0;
	pinMode(PIN_IO,INPUT);
	for (int i=0; i<8; ++i) {
		digitalWrite(PIN_SCLK,HIGH);
		delayMicroseconds(1);
		digitalWrite(PIN_SCLK,LOW);
		delayMicroseconds(1);

		bit = digitalRead(PIN_IO);
		input_value |= (bit<<i); // Bits are read LSB first.
	}
	return input_value;
}

void shiftOutEx(const uint8_t value) {
	bool pinModeFlag = false;
	pinMode(PIN_IO, OUTPUT);
	for (int i=0;i<8;++i) {
		digitalWrite(PIN_IO, (value>>i)&1);
		delayMicroseconds(1);
		digitalWrite(PIN_SCLK,HIGH);
		delayMicroseconds(1);

		if (i==7) {
			if (value==0xBF) pinModeFlag=true; // clock Burst Read
			if ((value>=0x80)&&(value<=0x8D)&&(value%2)) pinModeFlag=true;
		}
		if (pinModeFlag) {
			pinMode(PIN_IO,INPUT);
		} else {
			digitalWrite(PIN_SCLK,LOW);
			delayMicroseconds(1);
		}
	}
}

uint8_t readReg(const uint8_t reg) {
	digitalWrite(PIN_SCLK,LOW);
	digitalWrite(PIN_CE,HIGH);
	delayMicroseconds(4);
	shiftOutEx(reg);
	uint8_t dec = bcd2dec(shiftInEx());
	digitalWrite(PIN_CE, LOW);
	delayMicroseconds(4);
	return dec;
}

void writeReg(const uint8_t reg, uint8_t value) {
	digitalWrite(PIN_SCLK,LOW);
	digitalWrite(PIN_CE,HIGH);
	delayMicroseconds(4);
	shiftOutEx(reg);
	shiftOutEx(value);
	digitalWrite(PIN_CE, LOW);
	delayMicroseconds(4);
}

void writeProtect() {
	writeReg(0x8E,0x00);
}

// トリクルチャージ設定(1ダイオード,2kΩ)
void trickleCharge() {
	writeReg(0x90,0xA5);
}

void getDateBurst() {
	digitalWrite(PIN_SCLK,LOW);
	digitalWrite(PIN_CE,HIGH);
	delayMicroseconds(4);
	shiftOutEx(0xBF); //clock Burst Read
	uint8_t ss  = bcd2dec(shiftInEx() & 0x7F);
	uint8_t ii  = bcd2dec(shiftInEx());
	uint8_t hh  = bcd2dec(shiftInEx());
	uint8_t dd  = bcd2dec(shiftInEx());
	uint8_t mm  = bcd2dec(shiftInEx());
	uint8_t day = bcd2dec(shiftInEx());
	uint8_t yy  = bcd2dec(shiftInEx());
	digitalWrite(PIN_CE, LOW);
	delayMicroseconds(4);
	sprintf(clockTime,"%02d%02d%02d%02d%02d%02d",yy,mm,dd,hh,ii,ss);
	sprintf(editTime, "20%02d-%02d-%02d %02d:%02d:%02d",yy,mm,dd,hh,ii,ss);
	sprintf(shortTime,"%02d%02d%02d",yy,mm,dd);
}

// 時刻を設定する
void adjustClock() {
	char updateTime[13];
	int yy=21,mm=01,dd=18,hh=19,ii=31,ss=00,day=Mon;
	sprintf(updateTime,"%02d%02d%02d%02d%02d%02d",yy,mm,dd,hh,ii,ss);
	getDateBurst();
	// シリアル通信開始時の、Arduinoオートリセット機能対応
	if (strcmp(updateTime,clockTime)>0) {
		writeProtect();
		digitalWrite(PIN_SCLK,LOW);
		digitalWrite(PIN_CE,HIGH);
		delayMicroseconds(4);
		shiftOutEx(0xBE); //clock Burst Write
		shiftOutEx(dec2bcd(ss));
		shiftOutEx(dec2bcd(ii));
		shiftOutEx(dec2bcd(hh));
		shiftOutEx(dec2bcd(dd));
		shiftOutEx(dec2bcd(mm));
		shiftOutEx(dec2bcd(day));
		shiftOutEx(dec2bcd(yy));
		//shiftOutEx(0x00); // Write protecton register
		digitalWrite(PIN_CE, LOW);
		delayMicroseconds(4);

		trickleCharge();
	}
}

void updateTime() {
	Serial.println("updateTime=" + recv);
	uint8_t yy = (recv[0]-0x30)*10 + (recv[1]-0x30);
	uint8_t mm = (recv[2]-0x30)*10 + (recv[3]-0x30);
	uint8_t dd = (recv[4]-0x30)*10 + (recv[5]-0x30);
	uint8_t hh = (recv[6]-0x30)*10 + (recv[7]-0x30);
	uint8_t ii = (recv[8]-0x30)*10 + (recv[9]-0x30);
	// writeReg(0x80,dec2bcd(ss)); // 秒
	writeReg(0x82,dec2bcd(ii)); // 分
	writeReg(0x84,dec2bcd(hh)); // 時
	writeReg(0x86,dec2bcd(dd)); // 日
	writeReg(0x88,dec2bcd(mm)); // 月
	writeReg(0x8C,dec2bcd(yy)); // 年
}

void getTime() {
	getDateBurst();
	digits[0] = clockTime[6]-0x30;
	digits[1] = clockTime[7]-0x30;
	digits[2] = clockTime[8]-0x30;
	digits[3] = clockTime[9]-0x30;
}

void setTime() {
	while (Serial.available())  {
		char data = Serial.read();
		Serial.print(data);
		if ((data=='\n')||(data=='\r')) {
			if (recv.length()==10) {
				updateTime();
				getDateBurst();
				Serial.println(clockTime);
			}
			recv = "";
		} else {
			recv += data;
		}
	}
}

void setup_DS1302() {
	digitalWrite(PIN_CE, LOW);
	pinMode(PIN_CE, OUTPUT);
	pinMode(PIN_IO, INPUT);
	digitalWrite(PIN_SCLK, LOW);
	pinMode(PIN_SCLK,OUTPUT);
}

void getTemperature() {
	sensors_event_t humidity, temp;
	aht.getEvent(&humidity, &temp);
	int intTemp = (int)(temp.temperature * 100);
	digits[0] = (int)(intTemp/1000); intTemp -= (digits[0]*1000);
	digits[1] = (int)(intTemp/100);  intTemp -= (digits[1]*100);
	digits[2] = (int)(intTemp/10);   intTemp -= (digits[2]*10);
	digits[3] = intTemp;
}

void setup_AHT10() {
	 if (! aht.begin()) {
		Serial.println("Could not find AHT? Check wiring");
		while (1) delay(10);
	}
}

void drawDigit(int pos, int num) {

	for (int i=0;i<5;++i) pinMode(cathode[i], INPUT);

	pinMode(cathode[pos+1], OUTPUT);
	digitalWrite(cathode[pos+1], 0);

	for (int i=0;i<7;++i) digitalWrite(anode[i], characterdata[num][i]);

	delay(2);
}

void drawColon() {

	for (int i=0;i<5;++i) pinMode(cathode[i], INPUT);

	pinMode(cathode[0], OUTPUT);
	digitalWrite(cathode[0], 0);

	for (int i=0;i<7;++i) digitalWrite(anode[i], 0);
	digitalWrite(anode[1], 1);

	delay(2);
}

void setup () { 

	Serial.begin(115200);

	setup_DS1302();
	setup_AHT10();

	for (int i=0;i<7;++i) {
		pinMode(anode[i], OUTPUT);
		digitalWrite(anode[i], LOW);
	}
	for (int i=0;i<5;++i) {
		pinMode(cathode[i], INPUT);
	}
}

void showLED() {
	for(int i=0;i<250;i++) {
		drawDigit(0,digits[0]);
		drawDigit(1,digits[1]);
		drawColon();
		drawDigit(2,digits[2]);
		drawDigit(3,digits[3]);
	}
}

void loop () {
	setTime();
	getTime();
	for(int i=0;i<3;i++) showLED();
	getTemperature();
	showLED();
}
サンプルプログラムでは、デバイスモニターを起動して、西月日時分を各々2桁で入力すると、時刻を更新できます。
例えば、西暦2021年1月30日21時5分の場合
$ platformio device monitor -p /dev/ttyUSB0 -b 115200
2101302105
 Raspberry Pi(ラズベリー パイ)は、ARMプロセッサを搭載したシングルボードコンピュータ。イギリスのラズベリーパイ財団によって開発されている。
2019.12.13 モバイルバッテリーによる瞬間停電対策
2020.01.01 1280x800 HDMI MONITOR
2020.01.12 micro:bitをコマンドラインで使う
2020.02.04 サーマルプリンタを使う
2020.03.27 M5Stackキーボードを利用する
2020.04.10 電卓を制御して数字を表示する
2020.05.06 箱庭回路 蓄電&昇圧回路
2020.06.29 液晶キャラクターディスプレイLCD1602A
2020.08.03 Seeeduino XIAO
2020.08.09 LGT8F328P - Arduino clone
2020.09.18 電流計測モジュール INA219
2020.09.04 箱庭回路 センサーライト
2020.09.29 シガーライターIC s090c
2020.10.13 自動給水装置 LM393+NE555
2020.12.05 FM放送受信 TEA5767
2021.01.30 DVD Player LED
2021.02.16 癒しの電子回路
2021.03.06 疑似コンソール
2021.04.13 GPIO拡張
2021.08.08 電子ペーパー
2021.09.04 AVRマイコン・ATTiny85


ニーア オートマタ PLAY ARTS改 <ヨルハ 二号 B型 DX版> PVC製 塗装済み可動フィギュア
「NieR:Automata」より、ヨルハ二号B型こと2BがPLAY ARTS改に新たに登場! 高級感の感じられるコスチュームや髪の質感、洗練されたボディバランス、細かなデティールに至るまでこだわり抜かれた逸品。 DX版には通常版のラインナップに加え2Bの随行支援ユニット ポッド042などをはじめ“純白の美しい太刀"白の約定やエフェクトパーツ、自爆モードを再現できる換装用ボディパーツ、シーンに合わせて変えられる顔パーツ2種も付属する豪華な仕様に。 作中のあらゆるシーンを再現することが可能なファン必見の一品となっている。

DIPスイッチで動作電圧を3.3Vと5Vに切り替えられるUNO互換ボード
KEYESTUDIO Plus Board for Arduino UNO R3 with Type-C USB Cable, 3.3V 5V 1.5A Output Current, More Powerful Controller Board USB-シリアルチップ:CP2102 / 動作電圧:5Vまたは3.3V(DIPスイッチ制御)/ 外部電源:DC 6-15V(9V推奨)/ デジタルI / Oピン:14(D0〜D13)/ PWMチャネル:6(D3 D5 D6 D9 D10 D11)/ アナログ入力チャネル(ADC):8(A0-A7)/ DC出力機能の各I / Oポート:20 mA / 3.3Vポートの出力能力:50 mA / フラッシュメモリ:32 KB(うち0.5 KBはブートローダーによって使用されます)/ SRAM:2 KB(ATMEGA328P-AU)/ EEPROM:1 KB(ATMEGA328P-AU)/ クロック速度:16MHz / オンボードLEDピン:D13

エレクトロクッキー Leonardo R3 ATmega32u4 ボード DIY Arduino工作用 - ピンクエディション


Newtonライト2.0 ベイズ統計
ベイズ統計は,結果から原因を推定する統計学です。AIや医療などの幅広い分野で応用されています。その基礎となるのは18世紀に考えだされた「ベイズの定理」です。 この本では,ベイズ統計学のきほんをやさしく紹介していきます。

Interface 2021年10月号
☆特集:~ 格好良さアップ! 機能&信頼性アップ ! ~「 3Dプリンタ & メカ設計入門 」
☆特集2:Pico達人への道…「 C/C++でMicroPython拡張 」


トランジスタ技術 2021年9月号
☆特集:~ 直流・交流・非接触・センサ微小電流の測定ノウハウ ~「電流を正しく測る技術」

トランジスタ技術スペシャル 2021年7月号 宇宙ロケット開発入門
これから開発・活用が進むと期待されている宇宙空間への交通・物流インフラとして、小型・低価格ロケットが注目を集めています。本書では、基本構造から制御メカニズムまで、小型宇宙ロケット開発の基礎知識を実例を交えて解説します。

日経Linux 2021年9月号
【特集1】おうち時間をLinuxデスクトップで楽しむ! Linux環境を作るワザ
【特集2】徹底図解で丸わかり! 「WSL2」入門   Windows 11の新機能を速報!
【特集3】IT自動化ツール AnsibleでWeb導入を自動化
【特集4】ラズパイで楽しむLinuxライフ 「今、会議中」と家族に伝えるプレートをPythonで作ろう


ラズパイマガジン2021年秋号
特集1 サクッと動くパーツ&ライブラリ総覧
特集2 ArduinoライブラリでラズパイPicoを動かす
特集3 古いラズパイをフル活用! Node-REDで 楽しい電子工作
特集4 空気の汚れをラズパイで検知しよう
特集5 ラズパイで楽しむLinuxライフ
特集6 NVIDIAのAIボードが6000円台に!
特集7 M5StickCで始める電子工作 iPhoneからサーボモーターを制御しよう


トランジスタ技術スペシャル 2021年 4月号 No.154「達人への道 電子回路のツボ」
初学者が実用的な電子回路を設計できるようになるためのポイントをまとめました。学校の教科書だけではつかめない基本電子回路やOPアンプ/トランジスタの使い方の実際を、いろいろな視点から解説しています。


Raspberry Pi 3 Model B V1.2 (日本製) 国内正規代理店品
【仕様概要】CPU:ARM 1.2GHz 4コア、GPU:2コア 3D・動画支援、RAM:1GB、ネットワーク:LAN/Wi-Fi/Bluetooth、インターフェース:USB/HDMI/オーディオ/GPIO(UART/I2C/I2S/SPI...)。

ELEGOO Arduino用 Nanoボード V3.0 CH340/ATmega328P、Nano V3.0互換 (3)


ESPr Developer 32
スイッチサイエンス(Switch Science)

協和ハーモネット UL1007 AWG24 耐熱ビニル絶縁電線 リール巻 100m 黒


白光(HAKKO) ダイヤル式温度制御はんだ吸取器 ハンディタイプ FR301-81


サンハヤト TTW-203 テストワイヤ
ブレッドボードとスルーホール間の接続に便利なワイヤですブレッドボード用のオスピンと基板のスルーホール用のバネ性のある端子を組み合わせたテストワイヤです

無水エタノールP 500mlx2個パック(掃除)


ケイバ(KEIBA) マイクロニッパー MN-A04


熱収縮チューブφ1.5
印字無しで綺麗☆ シュリンクチューブ 絶縁チューブ 防水 高難燃性 収縮チューブ (2m, ブラック(黒))


サンハヤト SAD-101 ニューブレッドボード


白光(HAKKO) HEXSOL 巻はんだ 精密プリント基板用 150g FS402-02


【Amazon.co.jp限定】エーモン 電工ペンチ 全長約255mm (1452)


[Amazon限定ブランド]【指定第2類医薬品】PHARMA CHOICE 解熱鎮痛薬 解熱鎮痛錠IP 100錠


Copyright © 2011-2022 Sarako Tsukiyono All rights reserved®.