matplotlibでエミッター接地のトランジスターの静特性のグラフを描く

表題にあるように、教科書に載っているようなエミッター接地のトランジスターの静特性のグラフを描きます。

KURO
トランジスターの静特性って一枚のグラフで描けるの?
NIKE
Matplotlibを使うと以外に簡単にできるんです。
KURO
ちょっとコードをみるとなかなか大変そう。
NIKE
でも前の記事にある4つのグラフを強引に一枚にするやり方の応用ですよ。要は、plt.axes()をつかっているだけです。ただデータの個数やラベルでコードが長くなっているだけだよ。

コードは以下。

描いたグラフです。
さらに原点のラベルも調整するといいかもしれません。

追記
もう少し体裁を整えるとここまでできます。

written by gatamix

まとめ Raspberry Pi i2cモジュールを使ってみる

Raspberry Pi でのi2cモジュールの使ったものについてまとめてみました。

written by gatamix

ラズパイ(41) センサーの値をmysqlに書き込む

Gatamixです。
温度センサー(lps25h)の値をデータベースに書き込んでみます。

python ライブラリーのインストールをします。

$sudo apt-get install python-dev
$sudo apt-get install libmysqlclient-dev
$sudo pip install MySQL-python

メタ変数は以下です。
foge:データベース名
huga:テーブル名
foo:ユーザー名
passwd:パスワード

書き込み用のpythonコードです。

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
 
import smbus
import time
import sys
import datetime
import MySQLdb

Device_add = 0x5d 
 
#通信確認
whoami = smbus.SMBus(1).read_byte_data(Device_add, 0x0f)
if whoami != 0xbd:
    print('接続できません')
    sys.exit()

#レジスタ切り替え(モード変更)
smbus.SMBus(1).write_byte_data(Device_add, 0x20, 0x90) 
time.sleep(1)

#データ読み込み

buff = [0 for i in range(5)]
buff[0] = smbus.SMBus(1).read_byte_data(Device_add, 0x28)
#print("buff[0]=%x" % buff[0])
buff[1] = smbus.SMBus(1).read_byte_data(Device_add, 0x29)
#print("buff[1]=%x" % buff[1])
buff[2] = smbus.SMBus(1).read_byte_data(Device_add, 0x2A)
#print("buff[2]=%x" % buff[2])
buff[3] = smbus.SMBus(1).read_byte_data(Device_add, 0x2B)
#print("buff[3]=%x" % buff[3])
buff[4] = smbus.SMBus(1).read_byte_data(Device_add, 0x2C)
#print("buff[4]=%x" % buff[4])

Data = [0 for i in range(2)]

"""---------------------------
圧力データ24bitデータ
8bitデータをシフトして結合
---------------------------"""

Data[0] = (buff[2] << 16 | buff[1] << 8 | buff[0])

"""---------------------------
温度データ16bitデータ
8bitデータをシフトして結合
---------------------------"""

Data[1] = (buff[4] << 8 | buff[3])

"""------------------------
圧力データの計算
Pout(hPa) = PRESS_OUT / 4096
-------------------------"""

Data[0] = float(Data[0]) / 4096

"""---------------------------
マイナスデータの補正と
温度データの計算
T(°C) = 42.5 + (TEMP_OUT / 480)
----------------------------"""

if Data[1] & 0x8000:
    Data[1] = -((Data[1] - 1) ^ 0xffff)
Data[1] = float(Data[1]) / 480.0 + 42.5

#出力-------------------------

print("Pressure %.2f hPa" % (Data[0]))
print("Temperature %.2f degree" % (Data[1]))

connector = MySQLdb.connect(host="localhost", db="hoge", user="foo", passwd="passwd", charset="utf8")
cursor = connector.cursor()
 
str_tmp = "%6.2f" % Data[1]
sql = u"insert into fuga values(now(), %s)" % str_tmp
cursor.execute(sql)
 
connector.commit()
 
cursor.close()
connector.close()

確認
$sudo mysql -u foo -p
>use hoge;
>select * from fuga;

written by gatamix

100均のusbケーブルを5V電源とする

Gatamixです。
電子工作用に電源を探していて、usbケーブルから5V電源が作れるということを発見したのでケーブルを剥いてみました。使用したのは、ダイソーのスマートフォン用充電専用usbケーブルです。

usbのType Aは下図のように4本の線があります。データ送信用のD+,D-と電源5V,GNDの4本です。

今回使用したケーブルは充電用なので、2本(電源5V,GND)のみでした。
ケーブルの対応を確認したところ、灰色+5V,白GNDでした。

このケーブルにusbの電源アダプタを接続すれば、5V電源として使用できます。

written by gatamix

まとめ Raspberry Pi でLチカ

Gatamixです。
Raspberry Pi でのLEDを点灯についてを下記サイトにまとめました。
ラズパイ(13)~(16),(18)の内容となっています。

written by gatamix

ラズパイ(36) センサーで測定した値をメールで送る

Gatamixです。
センサーを使っての一つの目標だったデータの送信を行ってみました。
使ったセンサーはいつものLPS25Hです。
処理の流れは以下です。
①データの取得(温度、気圧)
②CSVに記録
③プログラムで自動でグラフ作成
④メールでCSVファイルとPNGファイルを送信する
記録:添付ファイルのヘッダーを追加するところでスペルミスをしました。
メールの添付ファイルがファイル名が表示されないという結果があらわれて、
ミスをしてもメールは送信されたので原因が究明に時間がかかりました。
*MIMEについてMultipurpose Internet Mail Extensionsの略である。
電子書式で色々なフォーマットを取り扱うための規格。
ここが間違えると上手く表示されない。


以下コード(長いですが参考までに記載します。)

written by gatamix

ラズパイ(35) ADS1015 12ビットADC

Gatamix です。
12ビットADC(ADS1015)を購入して使ってみました。
これで、Cds光導電セルの値を取得します。
下図のように接続しました。

データ取得の専用パッケージをインストールします。
$sudo pip install adafruit-ads1x15
専用パッケージを呼び出します。
import Adafruit_ADS1x15
データの読み込みは
adc.read_adc(0,gain=GAIN)/500.0
で行っていますが、
Gain の設定は以下のようになっています。リンク参照。

Gain=1( 0.0V – 4.096V)
変換は11bit(2048)の分解能なので、
取得値×(4.096/2048)=取得値×(1/500)
となります。
コードは以下です。

written by gatamix

ラズパイ(32) センサーで測定したデータをグラフに自動描画する

Gatamixです。
Raspberry piの調子がイマイチですが、LPS25Hを使って以下のことをやってみました。
①データの取得(温度、気圧)
②CSVに記録
③プログラムで自動でグラフ作成
スケールを自動にするとオフセットでグラフが表示されるのでオフセットをなしに設定しました。
以下プログラム。
Raspberry pi でascii コードのエラーで℃が表示できなかったのを解決しました。
(python 2.7だからか?Mac python 3.6では表示できた。)
温度の単位をTex 形式で表示できるので、
変更。deg. → $^\circ$C

written by gatamix

ラズパイ(27) センサー(LPS25H)で測定したデータをcsvファイルに保存する

Gatamixです。
最近の記事で、CSVの取り扱いをやってきました。
今回は、センサー(LPS25H)で測定したデータをCSVに保存します。
簡単に説明すると、
 ①センサーの初期設定
 ②データの読み込み
 ③CSVの書き込み
 ④インターバル
 ⑤、②〜④を繰り返す
 ⑥データ名の変更
となります。
これまでの記事の内容でできました。
プログラムです。

written by gatamix

ラズパイ(24) LPS25H 番外編 ビット演算と2の補数について

少し補足します。
スマホだと横にしないと上手く表示されないかもしれません。
・bitの結合について
前のプログラムで
Data[0] = (buff[2] << 16 | buff[1] << 8 | buff[0])
と気圧のデータを処理している場所があると思います。
例えば
buff[2] = 0x0f(16進数) = 00001111(2進数)
buff[1] = 0x4e(16進数) = 01001110(2進数)
buff[0] = 0x33(16進数) = 00110011(2進数)
とする場合
上位のbitの場合buff[2]を16bit 左にシフトしているので
00001111 00000000 00000000(2進)
となります。
これらを論理和で計算する場合は、以下となります。

 

 

 

・負の値の補正
前のプログラムの
if Data[1] & 0x8000:
Data[1] = -((Data[1] – 1) ^ 0xffff)
の部分の補足です。
マイナスの場合に2の補数でデータが格納されているので
そのままだと正の値で計算されてしまうので
絶対値にして、マイナス符号をつけて、格納します。
2の補数は反転して( 排他的論理和(xor)をffff(16進)と行うことで反転します。)
それに1を足すことで作ります。

2補数の作成例

 

 

 

このプログラムの場合は2の補数を戻すので、
1を引いて、反転する(xor ffff(16進数))ことで求めます。
参考リンク

関連
Raspberry Pi(23)MEMSセンサー LPS25Hで温度と気圧の取得

written by gatamix