keiske-hongyo が 2022年02月12日12時13分09秒 に編集
初版
タイトルの変更
tinygoと74HC165を使用した入力ポートの拡張
タグの変更
tinygo
Xiao
74HC165
記事種類の変更
セットアップや使用方法
ライセンスの変更
(GPL-3.0+) GNU General Public License, version 3
本文の変更
## 初めに 前回は、[74HC595を使用した液晶表示](https://elchika.com/article/f146bcd7-5a4b-4ad3-adad-fbfd007cd66b/)について紹介をしました。Xiaoのように入出力ピンが少ないとできるだけ、ICなどを活用して少ないピン数で制御しないとすぐに入出力ポートが不足します。今回は、74HC165を使用した入力ポートの拡張について紹介します。 ## 74HC165とは 74HC165は、パラレル入力、シリアル出力のシフトレジスタを内蔵したロジックICで入力ピンの拡張をするときによく利用されています。 ## 回路図 今回の回路図です。 ![](https://camo.elchika.com/bd6a61225c459a0058c10349ff6689a48547f9db/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f33646164353039642d616133622d343132302d616433622d6638623565376137366139332f64363736303564612d666232332d343339332d626461392d636163616330643235646663/) 制御としてはあとに示す流れになります。 1. 74HC165の1番ピンの(SH/LD)をHighからLowに変化させ、入力の状態をレジスタに保持させます。初めにA(11番ピン)に接続された状態が出力されているので、取り込みます。 1. 取り込み後、2番ピン(CLK)のクロック入力のピンをHighにしてデータをシフトします。シフトされるとB(12番ピン)のデータに変更になるのでデータを取り込み、2番ピン(CLK)のクロック入力のピンをLowに変更します。 1. あとは、2.の処理を繰り返せば、データを取り込めます。(データはC->D->...->G->Hの順で出力されます) ## プログラムについて プログラムは次のようになります。開発環境については、[Seeed Xiaoを使用したTinyGoプログラミング~Lチカ編~ ](https://elchika.com/article/70406aa9-0997-4b9e-a714-87ba21d7b0c9/)と[tinygoと74HC595を使用したキャラクタ液晶表示 ](https://elchika.com/article/f146bcd7-5a4b-4ad3-adad-fbfd007cd66b/)を参考にしてください。 ```golang:main.go package main import ( "ShiftIn/ShiftIn" "fmt" "machine" "time" ) func main() { var data uint8 /* 構造体の宣言 */ shft := ShiftIn.New(machine.D7, machine.D8, machine.D9) for { /* シフトレジよりデータを取得 */ data = shft.GetData() fmt.Println(data) time.Sleep(time.Millisecond * 100) } } ``` ```golang:Shiftin.go package ShiftIn import ( "machine" ) type ShiftIn struct { data machine.Pin // シフトレジスタデータ入力ピン clk machine.Pin // シフトレジスタクロックピン sh machine.Pin // データロード制御 } /* シフトレジスタ初期化 */ /* (74HC165) QH(Data) -> Pin9 CLK -> Pin2 SH/LD -> Pin1 */ func New(data machine.Pin, clk machine.Pin, sh machine.Pin) ShiftIn { /* 構造体の宣言 */ shft := ShiftIn{} /* 構造体に格納 */ shft.data = data shft.clk = clk shft.sh = sh /* 各ピンの設定 */ shft.data.Configure(machine.PinConfig{Mode: machine.PinInput}) shft.clk.Configure(machine.PinConfig{Mode: machine.PinOutput}) shft.sh.Configure(machine.PinConfig{Mode: machine.PinOutput}) /* 初期状態の設定 */ sh.High() clk.Low() return shft } /* データ取得関数 */ func (shft *ShiftIn) GetData() uint8 { /* 格納変数の宣言 */ var inData uint8 /* 無名関数の宣言 */ setBit := func(in bool) uint8 { if shft.data.Get() { return 0x00 } else { return 0x01 } } // 格納変数クリア inData = 0x00 // MSBを取得 shft.sh.Low() shft.sh.High() inData |= setBit(shft.data.Get()) /* 残りのビットを取得 */ for i := 1; i < 8; i++ { inData <<= 1 shft.clk.High() inData |= setBit(shft.data.Get()) shft.clk.Low() } /* データを返す */ return inData } ``` ## 最後に 今回は、74HC165を使用して、入力ポートを拡張する方法について紹介しました。SeeedXiaoのようにピン数が少ないとすぐに入出力ピンが不足します。今回の74HC165や[tinygoと74HC595を使用したキャラクタ液晶表示 ](https://elchika.com/article/f146bcd7-5a4b-4ad3-adad-fbfd007cd66b/)で紹介した74HC595を使うことで入出力を拡張することができます。TinyGoだけではなくピン数が少ないマイコンを使用するときには役に立つと思います。 今は、仕事が忙しく、時間が取れないのでちょっとしたものしか紹介できないですが、紹介する内容がみなさんの作品作りの参考になればと思います。