2017年9月2日土曜日

カンバンツールtaigaをWindows上のVirtualboxにインストールして外部PCからアクセスする

Taigaはオープンソースのアジャイルかんばんツールです.


プロダクトバックロブの管理や,スプリント,かんばんなどの管理をサポートしてくれます. できてしまえば簡単なのですが,結構苦労したのでできたのでインストールメモを書いておきます.
(2019.04.22にdockerのインストール方法を一部更新しました)
目標(やりたいこと)
プライベートネットワークのWindows PCをtaigaのサーバーにして,プライベートネットワーク内の他の端末からアクセスしたい.

方法
Windows PCにVM環境であるVirtual boxをインストールし, その中にUbuntu Linuxをインストールし, その中にdocker環境を構築し,そこにtaigaをインストールする.
Virtual boxはブリッジ接続ではなく,NATで接続することでネットワーク環境への影響は最小限にしたい.

(Windows PCのIPアドレス 192.168.0.10とします.)

ここでは
VMの設定というとVirtualBoxのソフトウエアの設定
ゲストOSの設定をいうとUbunutのOSの設定
ホストOSの設定はWindowsのOSの設定を指します.

手順1 VM環境のインストール

Windows PCにVirtualBoxをインストールします.
Downloadはこちらからどうぞ.
(念のためVirtualBoxはOracleが開発しているVirtual Machineでオープンソースのフリーソフトです.)
ここでインストールするWindows OSをホストOS, VirtualBox内にインストールするOSをゲストOSと呼びます.

手順2 ゲストOSのインストール

今回はゲストOSにはUbuntuを使います.
UbuntuはこちらからUbuntu16.4.3 LTSをダウンロードしてください.
(前のバージョンだとCore dumpしてうまくdockerがインストールできない場合がありました)
インストールはVirtualBox内のメニューから行います.
その際にゲストOSの種類はUbuntu 64bitを選び,メモリは1.4GB程度, HDDは可変で30GB程度割り当てておきます.(ここら辺はお好みで)

手順3 VirtualBoxのネットワーク設定

次にVirtualBox内のメニューからネットワークの設定を行います.この設定はUbuntu内から外部,外部からUbuntu内への通信をどのように行うかを指定するものです.
今回はネットワークの種類としてNATを選びます.
NATはホストOS(ここではWindowsのこと)に割り当てられたIPアドレスを使って外部にアクセスを行います.ゲストOS(ここではUbuntuのこと)から外部のWebサーバをみることができます.一方で外部からはWindowsしか見えません.そこでポートフォワードをおこない,Windowsの特定のポートにアクセスしたばあい,ゲストOSの特定のポートに転送する設定を行う方法をとります.
(別にホストOSとIPアドレスを共通化しなくても良い場合は素直にブリッジ接続を選べば良いと思いますが,制約がある場合NATの方がよいでしょう)
ここではWindowsの8080ポートを受け付けるようにし,受け付けたデータをUbuntuの80番ポートにフォワードするように設定します.フォワードの設定は変更後すぐ適用されるようなので,VMの再起動などはありません.よってあとで適用しても構いません.
この8080ポートは後でtaigaの設定に使います
(始め80を80にフォワードするようにしたのですが,どうしてもパケットがVMに通じませんでした.)

手順4 Ubuntuへのdockerのインストール

次にゲストOS(ここではUbuntu)にdockerをインストールします.
最近docker は無償のCEと有償のEEに別れたようなのでここでCEをインストールします.
インストール方法は公式ページのこちらにあります.
ここでは必要な部分を使ってUbuntuのターミナルを開いて以下のコマンドを実行します
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install docker-ce
エラーが出なければこれでdockerがうまくインストールできたと思います.

手順5 taigaのインストール

次にゲストOSにdockerを使ってtaigaをインストールします.
taigaのdocker環境を用意してくださっている方がいるのでこちらを使用します.
https://hub.docker.com/r/accon/taiga/
を参考にします.
データファイルを保存する場所を作成するために, ゲストOSの適当な場所にデータディレクトリを以下のように作成します.[2019.04.22追記]
cd ~/
mkdir taiga-data
cd taiga-data
mkdir workspace
mkdir www
docker run -d -v ~/taiga-data/workspace:/develop/workspace:rw -v ~/taiga-data/www:/develop/www:rw  -p 80:80 -p 443:443 -p 5432:5432 -p 15672:15672 -t -i -h taiga --name taiga accon/taiga
と入力すればdockerによるインストールは完了です.

次にUbuntu内のブラウザから
http://localhost/install.html
にアクセスしてください.しばらくするとスクリプトによるインストールが完了して
「PROGRESS_[INSTALLATION_COMPLETE]」
と表示されていればOKです.
http://localhost/
にアクセスしてログイン画面が表示されるのでID admin Password 123123と
入力してログインしてください.
試しにいくつかプロジェクトを作って,データベースに書き込みができているかも確認しておきましょう.
無事操作ができればインストールは完了です.
(このインストール方法ではUbuntuへのポート80へのアクセスをdocker環境のポート80へ接続しています)

手順6 taigaの設定変更

ここからが本番です. このままだとネットワーク上の他のパソコンからtaigaを呼び出すことができないので, taigaの設定を変更します.
[2019.04.22 更新 dockerコンテナ内にログインする方法からdockerコンテナと接続したローカルファイルを編集する方法へ変更)
一つ目は~/taiga-data/www/conf.json です. ファイル内にあるlocalhostをWindowsのIPアドレス:8080に置き換えます. ここでWindowsのIPアドレスは192.168.0.10なので 設定ファイルを
root@taiga:/develop/www# more conf.json 
{
    "api": "http://192.168.0.10:8080/api/v1/",
    "eventsUrl": "ws://192.168.0.10:8080/events",
    "eventsMaxMissedHeartbeats": 5,
    "eventsHeartbeatIntervalTime": 60000,
    "eventsReconnectTryInterval": 10000,
    "debug": true,
    "debugInfo": false,
    "defaultLanguage": "en",
    "themes": ["taiga"],
    "defaultTheme": "taiga",
    "publicRegisterEnabled": true,
    "feedbackEnabled": true,
    "privacyPolicyUrl": null,
    "termsOfServiceUrl": null,
    "maxUploadFileSize": null,
    "contribPlugins": [],
    "tribeHost": null,
    "importers": [],
    "gravatar": true
}
と書き換えます. 次に ~taiga-data/workspace/taiga-back/settings/local.py の前半部分のアドレスを次のように書き換えます.
from .common import *
from .celery import *

MEDIA_URL = "http://192.168.0.10:8080/media/"
STATIC_URL = "http://192.168.0.10:8080/static/"
ADMIN_MEDIA_PREFIX = "http://192.168.0.10:8080/static/admin/"
SITES["front"]["scheme"] = "http"
SITES["front"]["domain"] = "192.168.0.10:8080"

SECRET_KEY = "mysecret"

DEBUG = False
TEMPLATE_DEBUG = False
PUBLIC_REGISTER_ENABLED = True

DEFAULT_FROM_EMAIL = "no-reply@example.com"
SERVER_EMAIL = DEFAULT_FROM_EMAIL

EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
EMAIL_USE_TLS = False
EMAIL_HOST = "127.0.0.1"
EMAIL_PORT = 25

BROKER_URL = 'amqp://guest:guest@localhost:5672//'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
CELERY_ENABLED = True

EVENTS_PUSH_BACKEND = "taiga.events.backends.rabbitmq.EventsPushBackend"
EVENTS_PUSH_BACKEND_OPTIONS = {"url": "amqp://taiga:PASSWORD@localhost:5672/taig
a"}

これで設定は完了です.
docker restart taiga
としてtaigaを再起動します.
 次にUbuntuの中のブラウザからhttp://192.168.0.10:8080/にアクセスしてみます.
うまくアクセスできれば次に Windowsのブラウザからhttp://192.168.0.10:8080/にアクセスします.
これでアクセスできていれば,プライベートネットワーク内の別のPCからhttp://192.168.0.10:8080/にアクセスします.
これでアクセスできれば完了です.

なおWindowsのFirewallを設定している場合はポート登録を行い8080ポートを受け付けるように設定します.

運用関連

ログイン画面が現れない

再起動後すぐにアクセスするとlogin画面が表示されないことがありますが,データベースの起動のライムラグによるもののようです.
しばらく待つとアクセスできるので ちょっと待ちましょう.

内容は随時更新していきます.

2017年5月19日金曜日

こんにちはTWELITEその2(開発環境を揃えてテストプログラムを動かしたい)

前回に続きTEWLITE 今回は開発環境を揃えて,サンプルプログラムを書き込みます.
基本的にはなんでも良いのでしょうが,メーカー推奨のeclipseを使います.

C/C++の開発しかしないので こちらのサイトの[Download Links]にある [Mac OS X (Cocoa) 64-bit]をクリックしてソフトをダウンロードします.
 KeplerとかLunaとかNeonとかはバージョンの名前です.
今回はNeon. 

ダウンロードしたものを解凍すると[eclipse]というアプリケーションがでてくるので これを適当な場所に移動して起動します.(インストーラーはないのでこれで完了)

念のためコンパイルできるかどうか動作確認をしてみます.(以下の行程はスキップしても良いです)

まずはWorkspaceを選びます.
/Users/ユーザー名/Documents/workspace が選ばれていると思いますのでそのまま[OK]を押します.

 次に[Welcome]のタブが出てきます.
ランチャになっているので[Create a new C++ project]を選びます.

 [C++ Project]のウィンドウが開くので プロジェクト名を適当な名前にします. 

[Project type]は[Hello World C++ Project]にして,
[Toolchains]は[Cross GCC]を選び [Next]を押します. 

Basic Setting の画面が出ますが,[Next]を押して次に進みます.

Select Configurations の画面が出ますが,[Next]を押して次に進みます.

Cross GCC Commandの画面が出ますが[Finish]を押して次に進みます. 

はじめの画面に戻りますので,ウィンド左上の[Welcome]のタブを閉じてしまいます. 

すると[Project Explorer]やソースコーソが表示されると思います. 

このままだとコンパイルはできても実行ができないので[Project]の中にある[Properties]を選び設定を追加します. [Run/Debug Settings]を選んで右側の[New]を押します.

 [Select Configuration Type]のウィンドウが出ますので[C/C++ Application]を選びます.

 [C/C++Application:]の欄に[Debug/プロジェクト名]を入力し[OK]を押します.

 これで[Run]から[Run]を選ぶと[Console]ウィンドウに
"!!!Hello World!!!"
が表示されます.

これで開発環境と動作確認は完了です.
一旦立ち下げましょう.
*スキップした方はここから


次にTWELITEのサンプルソースコードをメーカーサイトからダウンロードしてきます.
その1で入手している時には不要です.
もしまだダウンロードしていなければMac版の「2014/08月号 SDK ファイル 」をダウンロード. ファイルをダウンロードしたら適当な場所におきます.
ここでは
 /Users/ユーザー名/Documents/TWESDK/Wks_ToCoNet
にあるとして話を進めます.

 次にEclipseを起動し,先ほど記入したSDKを置いたディレクトリを選びます.
 バージョンが古いからうんぬんかんぬんとでますので[OK]を押します. 

試しにSamp_PingPongを動かします.
 [Samp_PingPong]のなかにあるPingPong.cを開きます.

この状態で[Build]するとエラーがでます.
Include fileにstdio.hを追加するとけるので
 #include <stdio.h>
を16行目あたりの適当なところに記入しておきます. これで[Build]すると無事コンパイルが終わります. あとは,[Build]フォルダにできた Samp_PingPong_PingPong_JN5164_0_1_4.bin をその1で紹介したjenprogを使って書き込みます. TWESDKを書類フォルダに入れている場合はターミナルで
 cd ~/Documents/TWESDK/Tools/jenprog/
./jenprog -f 0 ../../Wks_ToCoNet/Samp_PingPong2/PingPong/Build/Samp_PingPong2_PingPong_JN5164_0_1_4.bin 
などと転送すれば書き込みができます.


2017年5月7日日曜日

こんにちはTWELITEその1(シリアル通信とファームウエア書き換えをOSXで行いたい)

ArduinoでパワーMOSFETを使ってみるのその2の前に割り込み企画

この連休中はセンサーの値を無線で飛ばしてLCDで表示したくてTWELITEはじめてみました.

とりあえず以下の3つを入手
TWELITE DIP(DIP基板用TWELITE)
MONOSTICK(USB接続用TWELITE)
TWELITE R(TWELITE書き込み用基板)
しました.
参考書籍は
TWE‐Lite(トワイライト)ではじめるカンタン電子工作を入手.

TWELITE DIPがあれば,TWELITEの内蔵マイコンに初期インストールされている「超簡単!TWE標準アプリ」を使って単体でデータを飛ばすことができるというすぐれもの

TWELITEは無線通信機能と内蔵マイコンを持っているため,必要に応じてマイコン部分に自分でいろいろとプログラムを作って書き込むこともできます.この場合はTWELITE Rとパソコンを使ってプログラムを書き込みます.
ただ,Arduinoほどお手軽ではありません.例によってOSX環境で使うとなるとWindowsに比べていろいろめんどくさくなっており,備忘録としてメモ書きを残しておきます.(初めてのことをMac環境でやるものではないといえばそこまでですが)

1.USBドライバのインストール

まずFTDIドライバのインストールを行います.
私はFTDIドライバをこちらからダウンロード2.3を選んでインストールしました.
(OSX 10.12Sierraはドライバインストール不要とのことらしいですが,試さずにインストールしてしまいました.)

2. pyserialのインストール

次にpyserialをインストールします.

私はpython関連をAnacondaにお任せしているので
Anacondaの[Anaconda-Navigator]を起動し[Environments]から[pyserial]を選んでインストールしました.なおpyserial自体はpythonのパッケージなので直接起動するようなアプリケーションではありません.pythonを普段使われている方はpipからインストールすればよろしいかと思います.pythonをまだ使われていない方はAnacondaオススメです.

3.書き込みツールのインストール

次にこちらのページから開発元が公開しているjenprogをダウンロードします.
SDKにも含まれているのでどうせアプリ開発をやるのであればSDKをダウンロードしてしまいましょう.解凍したら適当な場所に動かします.
私は[書類]フォルダのなかにTWESDKフォルダをおきました.

次にOSXのターミナルアプリを使います.
コマンドラインを出したら
cd ~/Documents/TWESDK
として先ほど作成したTWESDKフォルダに移動します.
この場合はTools/jenprogフォルダ内にjenprogの実行ファイルがあります.
 cd Tools/jenprog
としてjenprogフォルダ内に移動したら
 ./jenprog -h
として動作を確認します.
./jenprog -h
*** jenprog ver 1.3 ***
Usage: jenprog.py [options]

Options:
  -h, --help            show this help message and exit
  -a ADDR, --address=ADDR
                        start reading at address
  -l LEN, --len=LEN     number of bytes to read
  -m MAC, --mac=MAC     reset the mac addr (e.g. -m 01234567ABCDABCD)
  -k KEY, --key=KEY     reset the license key
  -v, --verify          also verify after writing
  -z, --compare         compare between flash content and specified file
  -s, --show            show mac address and license key
  -e, --erase           erasing the flash after reading mac and license key
  -b BAUD, --baud=BAUD  baud rate for serial connection.
  -t TARGET, --target=TARGET
                        target for connection
  -F, --force           skip firmware compatibility
  -C, --list-com-ports  skip firmware compatibility
  -D CDIR, --current_dir=CDIR
                        current directory
などと表示されれば動作しています.

次にUSBに接続しているTWELITEのリストを出します.
 ./jenprog -l
と入力するとAdminパスワードをきかれるので入力するとUSBポートに刺さっているTWELITEの一覧が表示されます.
 
# TWEUSB device list (num=2)
# ID,S/N,Desc
0,MWV61OJ,MONOSTICK
1,MWS4BXE,TWE-Lite-R

うまく表示されない場合は差しっぱなしで再起動するとか,挿すポートを変えて見てください.私のMacBookProは一度認識されたあと引き抜くと認識してくれないことがあります.

さて,プログラムを書き込みます.
まず書き込みの確認として出荷時に書き込まれている「超簡単!TWELITE標準アプリ」をインストールしてみます.メーカーWEBから最新版ソフトをダウンロードし解凍します.
App_TweLite_Master_1_8_1_BIN(バージョンによります)の中にあるApp_TweLite_Master_JN5164_1_8_1.binとApp_TweLite_Master_JN5164_TOCOSTICK_1_8_1.bin
を~/Documents/TWESDK/Tools/jenprogフォルダ内にdataというディレクトリをつくりコピーしておきます.(どこで作業してもいいのですが簡単のため)
その上でファームウエアを書き換えるときはそれぞれ
./jenprog -f 0 ./data/App_TweLite_Master_JN5164_TOCOSTICK_1_8_1.bin 
./jenprog -f 1 ./data/App_TweLite_Master_JN5164_1_8_1.bin 
と入力します.すると
SET MWS4BXE INTO PROGRAM MODE
*** jenprog ver 1.3 ***
 file info: 04 03 0008
writing...
  0%..10%..20%..30%..40%..50%..60%..70%..80%..90%..done - 7.89 kb/s
done

OK: firmware is successfully programmed.
などと表示されれば無事完了です. 
プログラムを書き込んだらいちどリセットします.(忘れがちですが)
リセット方法は製品によって異なり,
TWELITE Rはボード上のリセットスイッチを押します.
MONOSTICKはリセットスイッチが押せないのでコマンドライン上から下記コマンドでリセットします.
./jenprog -r 0

最後に動作確認をします.
標準アプリケーションはシリアル通信でデータが送られてきています.
WindowsはTeratermを使うのが標準かと思いますが,私はMacの場合,Cooltermを使っています.

Cooltermを起動したら,[Options]の中の[Port:]からTWELITEのポートを選び,[Baudrate:]は115200を選びます.
シリアル通信のデータが表示されていることが確認できます.
(シリアルの確認だけであれば,Arduino IDEを使うのも簡単です)
これで一応Windowsの皆様と同じ土俵に乗ったはずです.
次はプログラムを作成して書き込んでみます.
その2はこちら

2017年4月14日金曜日

ArduinoでパワーMOSFETを使ってみる その1

ごぶさたしております

今回はArduinoでパワーMOSFETを駆動します.

まずはArduinoの電源制限の復習.本家Arduino.ccのこちらをごらんください

簡単にまとめると

VCCが5Vの時,ArduinoのI/Oピンで流せる最大定格電流は40mAとのことですので
各ピンあたり通常は20mAで使用するのが無難でしょうか.

また,ピン一本あたりの制限の他に何本かまとめた制限もあります.

ソース(供給)電流は
0~4ピン, A0~A5の合計が150mAを超えないこと
5~13ピンの合計が150mAを超えないこと
が推奨されています.
またシンク(吸い込み)電流は
ポート0~4ピンの合計で100mAを超えないこと
ポート5~13ピンの合計で100mAを超えないこと
ポートA0~A5ピンの合計で100mAを超えないこと
が推奨されています.

というわけでArduino単体でモーターや電流の大きな負荷駆動することはできないためパワーMOSFETを使用します.

秋月で手に入るパワーMOSFETに2SK4017(50V, 5A)や2SK2232(60V, 25A)があります. 
端子は図のように刻印を正面にして左からゲート,ドレイン,ソースです.



はじめに簡単な例としてLEDを駆動してみます.
必要なもの

  • Arduino UNO 1個
  • MOSFET 2SK4017 1個
  • LED OSDR3133A 1個
  • 抵抗 100Ω 1個
  • 抵抗 300Ω 1個
  • 抵抗 100kΩ 1個(省略可)
  • 単三電池 2個
  • 電池ボックス
  • 電池ボックス用リード線
  • ブレッドボード
  • 配線
を用意します.

LED一個でしたらArduinoの電源で十分ですが,この先モーターなどの大電流の負荷を駆動することも考え,電源を別に用意します.ここではこの電源をパワー系の電源と呼び乾電池を使います.

Arduinoへの接続は図のように接続します.
図1 実体配線図(クリックして拡大してください)


回路図は次のようになります.
図2 回路図(クリックして拡大してください)

MOSFETは負荷(ここではLED)に対して上側(電源の+側),下側(電源の−側)どちらにつけることも可能ですが,今回は回路が簡単なので下側に入れています.(一般に上側に入れる場合は制御電源のグランドを別に分けるなど回路の工夫が必要です.今回は乾電池使っているので問題ありませんが)

スケッチは
const int gate_pin = 11;
void setup() {
pinMode(gate_pin, OUTPUT);
}

void loop() {
digitalWrite(gate_pin, HIGH);
delay(1000);
digitalWrite(gate_pin, LOW);
delay(1000);

 }
としておきましょう.

ためしに動かしてみてください.LEDが点滅しているのが確認できます.

次に回路の簡単な説明をします.
R1はLEDの電流制限抵抗です. LEDの順方向電圧が2Vなので電源の3Vに対して10mA程度になるように電流を(適当に)調整しています.

R2はゲート抵抗です.
MOSFETはゲートに制御信号,ドレイン・ソースに制御したい系を接続します.
MOSFETは電圧駆動デバイスのため,ゲートに閾値以上の電圧をかけた場合にドレイン・ソース間の抵抗が下がります. ゲート・ソース間の抵抗は非常に高いためほとんど電流は流れず,MOSFETをオンの状態に保つ電流量はほとんど必要ありません.

注意が必要なのはパワーMOSFETスイッチング時です.
次の図にMOSFET等価回路の一つを示します.
図3 MOSFETの等価回路

MOSFETのデバイスの内部にはゲート電極とドレイン電極との間に構成されたキャパシタCgd, ゲート電極とソース電極との間に構成されたキャパシタCgsが存在します.
データシートによれば2SK4017のCgdの容量は60pF, Cgsの容量はは670p,2SK2232のCgdの容量は200pF, Cgsの容量は800pFです.
端子間の電圧は充電された電荷に応じてQ=CVで決まりますから,オフからオン,オンからオフする際には,これらのキャパシタに対して充電及び放電を行っていることになります.

一般に電荷が充電されていないキャパシタに電圧を印加すると,充電初期は回路はショートとみなせるため,電流は無限大となり回路が焼損する可能性があります.
これはMOSFETのゲートにマイコンをつなぐ場合も同じです.
もともとMOSFETのゲートには内部ゲート抵抗があるため,無限大の電流が流れるということはありませんが,抵抗なしでMOSFETのゲートにマイコンを繋ぐとスイッチング時のキャパシタの充電・放電電流でピンの許容電流を超える可能性があります.

そこでゲート抵抗が必要になります.この回路ではR2に相当します. 
もっとも安全サイドに考え, どんなときでも電流が20mAを超えないようした場合のゲート抵抗は250Ωになります.
よってお手軽にマイコンで駆動しようと思ったら300Ωもしくは1kΩ程度をつけて置くのが良いでしょう.

実際にスイッチング時にどのくらい電流が流れているのかを確認したのが下記の図4です. 図1, 2の回路においてR2の両端電圧をオシロスコープで測定しました.
ピーク電圧は5Vで1usec程度かけてCRの直列接続の挙動に従い減衰していきます.R2の抵抗は300Ωですのでピーク電流値は16.7mA程度流れていることがわかります.

図4 R2(300Ω)両端電圧


大きい抵抗を付ける場合スイッチング速度は遅くなるので,スイッチング損失が増えてしまいます.スイッチング損失が重要な場合は,ドライブのためにトランジスタやドライブICを使うことになりますがその話はまた.

次にR3です. MOSFETの動作自体には直接関係のない抵抗です.
この抵抗は制御系が動作していない状態でゲート電圧が0Vとなるようにプルダウン抵抗として使っています.
通常,制御系とパワー系の電源は制御系,パワー系の順番で投入します(オフ時はパワー系,制御系の順).
制御系が動作していない時はゲート電圧が不定であり,この状態でドレイン・ソース間に電圧をかけるとMOSFETに電流が流れてしまうことがあります.そこで仮にパワー系の電源だけを先にいれたとしてもMOSFETに電流が流れないようにするために100kΩの抵抗をグランドとゲートの間に入れています.

今日のおまけにLEDの明るさをPWMで調整してみましょう.

先ほどのスケッチを

const int gate_pin = 11;
void setup() {
pinMode(gate_pin, OUTPUT);
}

void loop() {
analogWrite(gate_pin, 25);
delay(1000);
digitalWrite(gate_pin, LOW);
delay(1000);

 }

と書き換えてみましょう.

LEDの明るさが変わったと思います.

いちごしっくり

 Arduino でパワーMOSFETを使ってみる その2はこちら