WSL+Ubuntuにgnuplotをインストール後、Xmingで表示する
1.はじめに
WSL(Windows System for Linux)によってWindows PCにubuntuを、またXmingをインストール済みの環境を想定しています。
2.gnuplotをubuntuにインストールする
ここからgnuplotをインストールする。今回インストールしたバージョンは、5.2.8です。
①リンクからダウンロード後、解凍したものを適当なディレクトリ下に配置する。
②cd /~/gnuplot-5.2.8
でディレクトリ移動。
③bash ./configure
を実行。
④make
を実行。
⑤sudo make install
を実行でインストール完了のはず。
3.ターミナルでgnuplotを起動
①:~$ gnuplot
で起動する。
②gnuplot> plot sin(x)
で描画する。このとき、Windowsにインストール済みのXmingによって別ウィンドウが呼び出されて開く。(Windows側でXmingを起動しておくことを忘れず)
【補足】
Windowsエクスプローラー画面で\\wsl$
を入力すると、GUI操作でUbuntu内ファイルを確認でき便利かもです。
以上です。
ステッピングモータ(バイポーラ型)をArduinoで簡単に回す
1.はじめに
ステッピングモータをArduinoで回しました。モータドライバはこれを使いました。
2.配線時の注意
【モータドライバ端子への接続】
AOUT1 -> 黒 (ステッピングモータ端子)
AOUT2 -> 赤
BOUT1 -> 緑
BOUT2 -> 青
ーーーーーーーーーーーーーーーーーーーー
AIN1 -> D4 (Arduinoデジタルピン)
AIN2 -> D5
BIN1 -> D6
BIN2 -> D7
3.Arduinoコード
#include <Stepper.h> const int stepsPerRotate = 200;//ステップ数 = 360 / ステップ角 = 360 / 1.8 = 200 Stepper myStepper(stepsPerRotate, 4, 6, 5, 7); void setup(){ } void loop(){ myStepper.setSpeed(20); myStepper.step(100); delay(500); myStepper.step(-100); myStepper.setSpeed(30); myStepper.step(100); delay(500); myStepper.setSpeed(50); myStepper.step(-100); delay(500); }
FPGA + Arduino (FPGArduino)でSPI通信
1. はじめに
FPGA + Arduino でSPI通信をやってみました。結構つまったところもあるので、備忘録として残しておきます。
まず、使用したFPGAは3.3V駆動で、使用したArduino Nano(Atmega328P搭載)が5V駆動なので、両者のあいだに双方向レベル変換モジュールを噛ました。1素子で4線分の変換をまかなえるやつだが、すべて同じ素子上に変換配線を設けるとお互いに信号が干渉し合う可能性があるかもしれない?というような記事をネットでみかけたので、安全策をとって2素子用いた。
そしてブレッドボード上で配線し回路を作ったのだけど、ジャンパワイヤの信号線では少し長すぎるようでノイズを多く拾ってしまうかもしれないので、市販のアルミホイルを巻いて簡易的に導線をシールドした。見た目が不恰好になった.....。要不要はわからない....。効果のほどもわからない。おそらく要らないだろう。
Arduinoの発振器が16MHzで、これをスケッチでは1/8に分周し、つまり2MHzの周波数で最終的には通信することにした。
※Arduino のGNDとFPGAのGNDを共通にすることを忘れない。
2. VHDLコード(slave側)
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity spi0529 is port ( CLK : in std_logic ; -- 50MHz -- SPI SCK : in std_logic ; nSS : in std_logic ; MOSI : in std_logic ; MISO : out std_logic ; -- register select SEL : in std_logic ; LED1 : buffer std_logic ); end spi0529 ; architecture RTL of spi0529 is -- BUS interface signal iSS : std_logic ; signal iMOSI : std_logic ; -- synchronizer signal iSS_SFT : std_logic_vector(2 downto 0) ; signal iSTRG : std_logic ; -- internal shift register signal iMOSI_SFT : std_logic_vector(7 downto 0) ; signal CNT : integer range 0 to 2499; signal TM : std_logic; signal nRESET : std_logic; begin -- input iSS <= not nSS ; iMOSI <= MOSI ; nRESET <= '1'; -- output MISO <= iMOSI_SFT(7) ; --クロック生成(2MHz), 50MHz / 2MHz = 25 process(CLK) begin if( CLK'event and CLK = '1' ) then if( CNT < 25 ) then TM <= '1'; CNT <= 0; else CNT <= CNT + 1 ; TM <= '0'; end if; end if; end process; -- synchronizer process (nRESET,TM) begin if ( nRESET = '0' ) then iSS_SFT <= "000" ; elsif rising_edge(TM) then iSS_SFT <= iSS_SFT(1 downto 0) & iSS ; end if ; end process ; -- internal register process (nRESET,SCK) begin if ( nRESET = '0' ) then iMOSI_SFT <= X"00" ; elsif rising_edge(SCK) then if ( iSS = '1' ) then iMOSI_SFT <= iMOSI_SFT(6 downto 0) & iMOSI ; if(iMOSI = '1') then LED1 <= '1'; else LED1 <= '0'; end if; end if ; end if ; end process ; end RTL;
3. ピンアサイン
4. Arduinoコード(master側)
/* * SPIマスタ * SS - Pin10 * MOSI - Pin11 * MISO - Pin12 * SCK - Pin13 */ #include <SPI.h> #define SSPin 10 void setup() { Serial.begin (9600); Serial.println("Master"); pinMode(SS,OUTPUT); //SSピンを出力設定 SPI.setBitOrder(MSBFIRST); SPI.setClockDivider(SPI_CLOCK_DIV8); // 16MHz/8 = 2MHz SPI.setDataMode(SPI_MODE2); SPI.begin(); } int t = 1; void loop() { char snd; char rcv; //UARTから読み込み snd = Serial.read(); //データがあれば送信 if(snd != -1){ SetSSPin(LOW); delayMicroseconds(t); SPI.transfer(snd); delayMicroseconds(t); SetSSPin(HIGH); delay(100); SetSSPin(LOW); delayMicroseconds(t); rcv = SPI.transfer(0); delayMicroseconds(t); SetSSPin(HIGH); //データ確認 Serial.print(rcv); Serial.print(" : "); Serial.print(rcv,DEC); Serial.print(" : "); Serial.println(rcv,BIN); } } void SetSSPin(int val) { digitalWrite(SSPin, val); }
5. 実験結果
Arduino(マスタ)側からシリアルモニタで連続した文字列"Hello World!"を送信すると、ちゃんとFPGA(スレーブ)側からデータが返ってきた。
STM32 (Arm社Cortex-M3コア搭載32bitマイコン) 開発環境の構築
1. はじめに
32bit Armマイコンを触ってみたくて、下のSTM32ボードと書き込み装置を購入した。今回はmbedじゃなくて、STM32F103C8T6 搭載の中華製ボードにした。
2. 統合開発環境 STM32CubeIDE の導入
公式ダウンロードサイトでメールアドレスの記入はあったがすぐにダウンロード出来た。Windowsだったので、STM32CubeIDE-Win
を選択してソフトウェア入手。以前のバージョンも選べるみたい。
3. STM32マイコンボードでLチカ
このサイトがとても参考になった。有難うございます...。
denshikousakusenka.jimdofree.com
このサイトを参考にすればLチカまで完了させれるが、一応、自分のPC画面のキャプチャも貼っておく。
①クロックを外部水晶にする(RCCのHSE -> Crystal)
②デバッグを有効にする(SYSのDebug -> Serial Wire)
③LEDに接続されているIO(PC13)をOutputとし、名前を "LED" に設定
※名前を"LED"に変更するのは、ピンの箇所を右クリックしたときに表示されるEnter User Label
で"LED"と入力すればいい。
④以上で、Peripheral が完了。次は、Clock Configration
タブをクリックして、クロックを下図のように設定する。
※今回は最大周波数72MHz?で動作するような設定値
⑤"Project" -> "Generate Code"を選択すると、各種設定が反映されたコードが生成される。
⑥左側の一覧からmain.c
を選び、Lチカさせるためのコードを2行だけ追加する。
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
HAL_Delay(500)
※2HzでLチカするプログラムです。
あのFPGAボードでDCモータをPWM制御する
1. はじめに
あのFPGAボードで今度はDCモータをPWM制御した。FPGAで任意にクロックを生成し、PWM信号として利用してみる実験。
2. 実験結果
使用したモータードライバはこの前と一緒のもの。この前はテストのためずっとHIGHをPWMに入れっぱなしだったが、今回はFPGAで分周したクロック入力を作り、PWMとして入力する。
が、実験したところ、モータ電源3V程度の設定では、PWMを高周波にし過ぎても正味かかる電圧(実効電圧)が低下すぎて?しまい、連続したモータ出力が得られなかった。
(実効電圧を概算したい場合、電力に変換⇒PWM周期より十分大きい領域で電力を時間積分⇒単位時間当たりの仕事量[W]に直して実効電圧を得る、のが調べると定石のよう)
モータ電源3Vの状態で1kHzぐらい(FPGAの発振器が50MHzなのでクロック換算なら50000回)与えてやるとOKだった。この時、モーターに流れる電流値は安定化電源の表示だと150mA程度だった。
(ブレッドボード上のスイッチは前やった実験の残り香です…。今回は使ってない)
3. コード
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity MOTOR is port( CLK : in std_logic; IN1, IN2, PWMA: out std_logic ); end MOTOR; architecture RTL of MOTOR is -- 5000カウントで0.1ms(10kHz), 50000カウントで1ms(1kHz) signal CNT_PWMA: integer range 0 to 4999999; signal PWMA_TR : std_logic; begin process( CLK ) begin if( CLK'event and CLK = '1') then if( CNT_PWMA < 50000 ) then PWMA_TR <= '1'; CNT_PWMA <= CNT_PWMA + 1; elsif ( 50000 <= CNT_PWMA and CNT_PWMA < 50000*2 ) then PWMA_TR <= '0'; CNT_PWMA <= 0; CNT_PWMA <= CNT_PWMA + 1; else CNT_PWMA <= 0; end if; end if; end process; process(PWMA_TR) begin if(PWMA_TR = '1') then IN1 <= '1'; IN2 <= '0'; PWMA <= '1'; else IN1 <= '0'; IN2 <= '0'; PWMA <= '0'; end if; end process; end RTL;
4. 参考資料
http://doc.switch-science.com/datasheets/TB6612FNG_datasheet_ja_20141001.pdf
Raspberry Pi + ラダーシーケンスでDCモータ制御
1. はじめに
前回の記事に引き続き、Raspberry Piでラダーシーケンスする記事です。前回は入門の入門編ということでLチカでしたが、つぎは少しだけ発展してDCモータ制御です。
モータードライバに2入力を与えて、正転・逆転・ストップ動作を制御します。本来ならマイコンのほうが断然書きやすいとおもうのですが、今回はラダーの勉強、ということで、そっちで実装します。
2. モータードライバ仕様書・ピン配置
モータードライバはAmazonで買った中華製モジュールを使います。安いので、とりあえずのテスト時にはとても助かりますね...。でも載ってるのはTOSHIBA製のモータードライバ(TB6612FNG)で、ブレッドボード上で扱えるようにDIP化したミニ基板に取り付けられている状態。ピンヘッダを半田付けさえすればすぐに使えるやつです。データシートはスイッチサイエンスのリンク先から拝借します。回路は、簡単なので端折ります。ピンアサインだけ備忘録として貼っておく...。
3. 実験結果
ラダーは下図のような風になった。MODE1=正転、MODE2=逆転、STOP=ストップ、以上3状態をスイッチ入力(X001, X002)に応答して状態遷移させるイメージでラダーを組んだ。「セットコイル」を使うのが考慮になくて1時間ははまってしまった。注意です。実体配線は写真のような感じに。
4. まとめ
ラダープログラムでモータードライバを噛ました回路でDCモータ制御の動作を確認できた。ラダー、癖が凄い。。。
参考資料
Raspberry Pi でシーケンス制御
1. はじめに
Raspberry PiでPLC(Programmable Logic Controller:シーケンサ)・シーケンス制御を実行し、理想としては制御工学の理論方面へのシフトもめざしながら学んでいくといったような内容の記事です(と徐々にしていくつもり)。開発環境にはCODESYSというソフトPLCを使う。基本的に趣味範囲の利用の仕方では無料。欧州では最も広く利用されているPLCソフトだそう。CODESYSには、Raspberry Piの成熟したプラットフォームを積極的に産業にも利用していこうといった意識がうかがえ、公式でCODESYSへのRaspberry Pi導入のための環境を提供している様子。
今回は、入門ということで、Raspberry Pi & CODESYS のセットアップを備忘録として残しながら、ラダープログラムによるLチカを実行してみる。また、ラダーの基礎となる「自己保持回路」を例にとって動作デモを行ってみる。
2. CODESYSのホストPC(Windows)への導入
①CODESYS公式ダウンロードサイトで、メインのソフトウェアをダウンロードする。
②Raspberry Pi 導入のためのCODESYS専用パッケージをダウンロードする。
③インストールしたソフトCODESYSの上部メニューバー の "ツール" -> "パッケージマネージャ" を開くとこんな感じ。
ここでさらに、出てきたウィンドウ右の"インストール" ボタンを押すと、前述の手順でダウンロードした Raspberry Pi 導入のための専用パッケージをCODESYS内にインストールし取り込むことができる。
3. Raspberry PiへのCODESYS環境の導入
①1回ソフトを xボタンで閉じる。で、再び起動させる。すると、メニューバーの "ツール" -> "Update Raspberry Pi" が選べるようになるので、そこからRaspberry Piのセットアップ画面を開く。
②ラズパイのユーザ名とパスワードを入力する。"Scan"を押す。CODESYSを開いているホストPC(今回はWindows)と今回制御するラズパイが同一ネットワーク内にあれば、"Scan"を押すだけで自動でラズパイのIPアドレスを探しに行く。正しいラズパイIPアドレスが表示されればOK。
③ラズパイが認識されたら、次は "Install" を押してCODESYSのシステムをラズパイに書き込む。若干時間がかかるが、待つ。その後、"Standard" (スタンダード)か "MC"(マルチコア)かどちらをシステムとして利用するかウィンドウで聞かれるので、適切な方をえらぶ。試しに、"System Info"を押して、ラズパイを正しく認識し、接続できているか確認する。下図のような表示が為されればOK。
4. Raspberry Pi & CODESYS によるラダープログラムでのLチカ制御
①新規プロジェクトを作成する。上部メニューバーの "ファイル" -> "新規プロジェクト" でウィンドウが開くので、"標準プロジェクト"を選択し"名前"と"場所"を任意に入力する。
②"標準のプロジェクト"ウィンドウが開くので、ラズパイ3などマルチコア対応のデバイスを用いる場合は"デバイス"に"CODESYS Control for Raspberry Pi MC SL(3S~~~~~)""を選択する。次の項目"PLC_PRGの言語"に今回は"ラダーロジックダイアグラム(LD)"を選択して"OK"押す。
③ここから、ラダー図を書いてゆく。触ればわかるので(わかりにくいのならば調べながら)、接点やコイルを下図のように配置して、基本的な「自己保持回路」を作成する。
機能としての動き方は、接点X001
(1つ目のスイッチ)を1回押すと、コイルY001
(LED)まで導通しONになる。X001
を押すのをやめ離しても、Y001
のON状態が保持される。なお、接点X002
(2つ目のスイッチ)を押すと、ONで導通していたY001
が切れて、OFFになる。
④次に、ラズパイのピンアサインを行う。左の"GPIOs_A_B_(GPIOs A/B)"を選ぶと、タブが開く。"GPIOs パラメータ"の箇所で、各GPIピンが"INPUT"か"OUTPUT"かを事前に指定しておく。今回は、"INPUT"がGPIO27とGPIO18で、"OUTPUT"がGPIO17とした。(2入力1出力)
⑤次に、同じタブ内の"GPIOs I/O マッピング"の箇所で、ラダー図で定義したX001
やX002
(入力スイッチ)、Y001
(出力LED)とさっきのGPIOピンとを紐付ける。今回は、下図の設定のようにした。
⑥ここまでで主要な設定は完了。ラズパイとの接続を開始する。"Device"の"通信設定" -> "ネットワークスキャン"を押し、raspberrypi
をデバイスとして選ぶ。正しく選ばれると、下図のように「緑色〇」のOKサインいたいなのが出る。
⑦"ツール" -> "Update Raspberry Pi" を押して、ラズパイ通信設定画面を開き、"Start"を押してラズパイとの接続を開始する。で、ここで一旦ラダープログラムをビルド。エラーなどでなければOK。メニューバーの"オンライン" -> "ログイン"でプログラムにログインする。
⑧"運転"(再生ボタン)を押すと、ラダープログラムが実行されている。
5. まとめ
ラダープログラム開発環境CODESYSにRaspberry Piを導入して、Raspberry PiをPLC化した。基本的な自己保持回路を例に、ラダーによってLチカすることができた。
Raspberry PiにVNC接続する時の画面解像度を変更する方法(メモ)
1.ターミナルで、sudo raspi-config
を打つ。
2.「7 Advanced Options」-> 「A5 Resolution」-> 「好きな解像度を選ぶ」
3.再起動。それだけ。