LIFE LOG(ここにはあなたのブログ名)

作業日誌 う靴

気ままにコンピュータ関連の備忘録などを書きます...。

WSL+Ubuntuにgnuplotをインストール後、Xmingで表示する

1.はじめに

 WSL(Windows System for Linux)によってWindows PCにubuntuを、またXmingをインストール済みの環境を想定しています。

2.gnuplotubuntuにインストールする

 ここから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入力を与えて、正転・逆転・ストップ動作を制御します。本来ならマイコンのほうが断然書きやすいとおもうのですが、今回はラダーの勉強、ということで、そっちで実装します。

uuktuv.hateblo.jp

2. モータードライバ仕様書・ピン配置

 モータードライバはAmazonで買った中華製モジュールを使います。安いので、とりあえずのテスト時にはとても助かりますね...。でも載ってるのはTOSHIBA製のモータードライバ(TB6612FNG)で、ブレッドボード上で扱えるようにDIP化したミニ基板に取り付けられている状態。ピンヘッダを半田付けさえすればすぐに使えるやつです。データシートはスイッチサイエンスのリンク先から拝借します。回路は、簡単なので端折ります。ピンアサインだけ備忘録として貼っておく...。

f:id:uuktuv:20200521134353j:plain

f:id:uuktuv:20200521131918j:plain

www.switch-science.com

3. 実験結果

 ラダーは下図のような風になった。MODE1=正転、MODE2=逆転、STOP=ストップ、以上3状態をスイッチ入力(X001, X002)に応答して状態遷移させるイメージでラダーを組んだ。「セットコイル」を使うのが考慮になくて1時間ははまってしまった。注意です。実体配線は写真のような感じに。

f:id:uuktuv:20200521131953j:plain

f:id:uuktuv:20200521132133j:plain

4. まとめ

 ラダープログラムでモータードライバを噛ました回路でDCモータ制御の動作を確認できた。ラダー、癖が凄い。。。

参考資料

www.switch-science.com

www.placeon.jp

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公式ダウンロードサイトで、メインのソフトウェアをダウンロードする。

store.codesys.com

Raspberry Pi 導入のためのCODESYS専用パッケージをダウンロードする。

store.codesys.com

③インストールしたソフトCODESYSの上部メニューバー の "ツール" -> "パッケージマネージャ" を開くとこんな感じ。

f:id:uuktuv:20200521041130j:plain

CODESYSインストール後の初期画面

 ここでさらに、出てきたウィンドウ右の"インストール" ボタンを押すと、前述の手順でダウンロードした Raspberry Pi 導入のための専用パッケージをCODESYS内にインストールし取り込むことができる。

3. Raspberry PiへのCODESYS環境の導入

①1回ソフトを xボタンで閉じる。で、再び起動させる。すると、メニューバーの "ツール" -> "Update Raspberry Pi" が選べるようになるので、そこからRaspberry Piのセットアップ画面を開く。

②ラズパイのユーザ名とパスワードを入力する。"Scan"を押す。CODESYSを開いているホストPC(今回はWindows)と今回制御するラズパイが同一ネットワーク内にあれば、"Scan"を押すだけで自動でラズパイのIPアドレスを探しに行く。正しいラズパイIPアドレスが表示されればOK。

f:id:uuktuv:20200521042256j:plain
Raspberry Pi セットアップ画面

③ラズパイが認識されたら、次は "Install" を押してCODESYSのシステムをラズパイに書き込む。若干時間がかかるが、待つ。その後、"Standard" (スタンダード)か "MC"(マルチコア)かどちらをシステムとして利用するかウィンドウで聞かれるので、適切な方をえらぶ。試しに、"System Info"を押して、ラズパイを正しく認識し、接続できているか確認する。下図のような表示が為されればOK。

f:id:uuktuv:20200521045805j:plain
セットアップ完了時のラズパイ3Bのインフォメーション

4. Raspberry Pi & CODESYS によるラダープログラムでのLチカ制御

①新規プロジェクトを作成する。上部メニューバーの "ファイル" -> "新規プロジェクト" でウィンドウが開くので、"標準プロジェクト"を選択し"名前"と"場所"を任意に入力する。

②"標準のプロジェクト"ウィンドウが開くので、ラズパイ3などマルチコア対応のデバイスを用いる場合は"デバイス"に"CODESYS Control for Raspberry Pi MC SL(3S~~~~~)""を選択する。次の項目"PLC_PRGの言語"に今回は"ラダーロジックダイアグラム(LD)"を選択して"OK"押す。

f:id:uuktuv:20200521044233j:plain
プロジェクトの作成

③ここから、ラダー図を書いてゆく。触ればわかるので(わかりにくいのならば調べながら)、接点やコイルを下図のように配置して、基本的な「自己保持回路」を作成する。

 機能としての動き方は、接点X001(1つ目のスイッチ)を1回押すと、コイルY001(LED)まで導通しONになる。X001を押すのをやめ離しても、Y001のON状態が保持される。なお、接点X002(2つ目のスイッチ)を押すと、ONで導通していたY001が切れて、OFFになる。

f:id:uuktuv:20200521061054j:plain
ラダー図(自己保持回路)

④次に、ラズパイのピンアサインを行う。左の"GPIOs_A_B_(GPIOs A/B)"を選ぶと、タブが開く。"GPIOs パラメータ"の箇所で、各GPIピンが"INPUT"か"OUTPUT"かを事前に指定しておく。今回は、"INPUT"がGPIO27とGPIO18で、"OUTPUT"がGPIO17とした。(2入力1出力)

f:id:uuktuv:20200520091645p:plain

⑤次に、同じタブ内の"GPIOs I/O マッピング"の箇所で、ラダー図で定義したX001X002(入力スイッチ)、Y001(出力LED)とさっきのGPIOピンとを紐付ける。今回は、下図の設定のようにした。

f:id:uuktuv:20200521051210j:plain
"GPIOs I/Oマッピング"の設定

⑥ここまでで主要な設定は完了。ラズパイとの接続を開始する。"Device"の"通信設定" -> "ネットワークスキャン"を押し、raspberrypiをデバイスとして選ぶ。正しく選ばれると、下図のように「緑色〇」のOKサインいたいなのが出る。   f:id:uuktuv:20200521093035j:plain

f:id:uuktuv:20200521072349j:plain

⑦"ツール" -> "Update Raspberry Pi" を押して、ラズパイ通信設定画面を開き、"Start"を押してラズパイとの接続を開始する。で、ここで一旦ラダープログラムをビルド。エラーなどでなければOK。メニューバーの"オンライン" -> "ログイン"でプログラムにログインする。

⑧"運転"(再生ボタン)を押すと、ラダープログラムが実行されている。

f:id:uuktuv:20200521061250j:plain
ラダー実行時(LED:OFF)

f:id:uuktuv:20200521061330j:plain
ラダー実行時(LED:ON)

f:id:uuktuv:20200521055821j:plain
Raspberry PiのPLC化

5. まとめ

 ラダープログラム開発環境CODESYSにRaspberry Piを導入して、Raspberry PiをPLC化した。基本的な自己保持回路を例に、ラダーによってLチカすることができた。