スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

DE0-NANO-SoC FPGAでMachinekit/LinuxCNC

DE0NANOSoCでMachinekit/LinuxCNCが動きました。

machinekitFPGA.png

参考とさせて頂いたのは、MachinekitBlog内のDE0-Nano-Soc update on SD card Imagesとゆう記述。

基本記述の通り、やっていけば動くのであろう、、とは思いますが、Linuxの仕組み自体に??な所多数。
BeagleBoneのMachinekitがとてもEasyにインストールできた感じ。

一応、RaspberrypiもBeagleboneもデスクトップ環境からの作業で、Machinekit自体インストールされたイメージが提供されてますが、このFPGASoC、モニタ繋ぐ所も無ければ、インストールイメージがコンソール、、。


LatencyTestはこんな感じ。
machinekitFPGA2.png

ただ、このボードに載っているのはBeagleboneや、RaspberrypiなどのグルーロジックなSoCではなく、FPGAとのSoCなので、入出力器は、どうも、MesaのFPGA I/OボードのHDL記述で動くご様子。
インストールとか、運用しやすい環境構築法のWeb上のテキスト等が充実すればBeagleboneを使用するMachinekitよりも、I/Oの制約がなくて良いのでは?と思います。

ただ、BeagleboneでのMachinekit、先のMachinekitBlog内にも書いてありますが、元々Beagleboneに使われているAM335xにハードウエアエンコーダーインターフェースであるeQEPがRPUとは別回路で3つも載っていて、Machinekit/LinuxCNCでのリアルタイムコンポーネントとして、ドライバも提供されてます(HAL上での作動のみ確認済)。
更に、PyBBIOとゆう、RPUの作動はありませんが、他のBeagleboneに載っているハードウエアペリフェラルをPythonの記述にて操作できます。
Pythonといえば、Machinekit/LinuxCNCのユーザー空間で作動するユーザースレッドとして作動させることができるので、モーションに余り関与しない範囲でBeagleboneのハードウエアを使うことが出来ます。

このあたりが、元々Media向け、携帯電話向けなRapberryPiのSoCMCUと、産業用機械のコントロール用に作られたBeagleboneのSoCMCUとの違いで、外部回路を繋がないとMachinekitとして使うことができないRaspberryPiと単体でコントローラーとして使えるBeagleboneの違いだと思います。

ただ、各公式掲示板等々の書き込みの伸びを見ていると、RaspberrypiのLinuxCNCの書き込みが圧倒的に有り、安価で出荷量の多い商品の強みなんだろうな、とも思います。



色々と設定を作ったり、操作したりってゆうのは、MachinekitのようなARMLinuxではなく、PC上のLinuxCNCの方が表示の速さ等々、扱いやすいのもまた事実。
パラレルポートの出力する
今の所一番良いのはPCにMesaのFPGAI/Oボードを載せたものなんだろうな、と思います。







ハードウエア器でのパルスジェネレート等々I/Oさえなんとかなれば、最近のLinuxが走るARMボードならなんでも行けそうな勢いですね。

実際、超安価に販売されているらしいARMLinuxなCHIPボードでも、CHIP公式のForum内でMachinekit running on CHIP with RT PREEMPT kernelなるスレッドが有り、どうも作動はするご様子。(試しませんが)
CHIPにMachinekitをインストールする記事を見つけたので貼り付けておきます。
Machine KoderMachinekit on the C.H.I.P. 9$ computer

テーマ : 自作・改造
ジャンル : コンピュータ

LinuxCNCのArduinoでのモーション以外のインターフェース。

かなり前に書いた記事、ArduinoとLinuxCNC内で紹介さしていただいた、ロシアな方のLinuxCNC+Arduinoとゆう記事を実際に試してみました。
この記事の元記事となったImproved Analog & Digital Interface with Arduinoとゆう記事の方は、相当前に試しており、今回、BeagleboneBlackやGreen、また、LinuxCNC公式の最新のDebian上のLinuxCNCでも動くかしらん?とためしてみたくなりました。

結論からゆうと、LinuxCNC+Arduinoとゆう記事そのままでは私の環境下では作動させることはできませんでした。

ただ、ソースコードを少々触ってHAL上での作動確認はとれたので、記事とします。

Arduiono側

LinuxCNC+Arduinoのページから、our changed versionとゆうリンクをクリック、ダウンロードして、解凍。解凍されたファイルの中のフォルダArduinoの中のarduino.inoをArduinoIDEにて開いてArduinoに書き込む。

書き込むスケッチ自体、さほど程度の容量しか無いので、ATMega328を使用したArduinoUnoでなくとも、ATMega168とUSBシリアルにCH340を載せ中華ArduinoNanoクローンでも十分で、私はソレを使いました。
記事中、ArduinoIDEのインストールから書かれていますが、Win/Mac等でArduinoIDEを使用し、該当スケッチを書き込んでも良いかと思われます。


Arduino側の準備はコレで終わりです。




LinuxCNCをインストールしたPC側


該当ファイルをダウンロードし、解凍。
記事中の指示に従い sudo apt-get update をし、 sudo apt-get install python-serial にてパイソンシリアルをインストール
一応指示通り、python -c 'import serial' にてパイソンシリアルを有効にし、ダウンロード解凍したファイルのディレクトリに移動、
arduino.py とゆうファイルをテキストエディタで開きます。
もしかしたら、監理者権限でないと編集できないかもしれません。
そんな時は、
sudo nano arduino.py
で開いてください。

ファイルを開いたら、38行目の

nout =6 を、nout=3に変更、上書き保存。

このままnout=6とすると、デジタルOUTが6つの設定となり、arduino-VCP.halファイル内の信号の接続と合わなくなりエラーが出て作動させることができません。

次にarduino.pyの名前の変更。
記事中にもある通り、ArduinoIDEがインストールされたPCには、arduinoとゆうファイル名が使えない?ので、他の名前(私はarduinooとしました^^;)に。

名前を変更した元.pyファイルを sudo mv ナニガシ /bin にて/binディレクトリに移動。
chmodで実行ファイルに変更。

その下でPATHを通すコマンドが有るのですが、既に/binディレクトリにはパスが通ってると思うのですが、
一応記事通り実行。

記事ではこの直後halrun arduino-VCP.hal と入力して実行なのですが、halrunして実行するファイル、arduino-VCP.halを開いて修正します。
ファイルを開くのに管理者権限が必要な場合はsudoを付けてnano ~ファイル名 で開きます。

一行目、
loadusr -W arduino /dev/ttyUSB0 3
とありますが、この-W を取り去り、その先に続くarduinoをarduino.pyを変更した名前に書き換え上書き保存。

端末にて、このarduino-VCP.halファイルと、arduino-VCP.xmlの有るディレクトリ上で
halrun arduino-VCP.hal としてHALを実行します。

コレでUSB接続されたArduinoが入出力インターフェースとして作動すると思います。

触ってみると解るのですが、GUIでの操作からの反応がニブいです。
これは、Arduinoに書き込んだスケッチ内でUARTの通信速度が9600bpsとなっているからです。
Arduinoのスケッチと、/binに名前を変えて移動したarduino.py内にUARTのボーレートの設定があります。
このボーレートを上げるように書き換えることで、反応は速くなりますが、ArduinoのADCの読取り周期の時間が短くなってしまうので、ボーレートを上げると ADCが同じピンを読み続ける?事となり、アナログ入力は実質1チャネルだけとなってしまいます。
6本のADCチャネルですが、1つのADCを切り替えて6チャネルとしているので、このようなことが起こります。
Arduino自体のADCの読取り速度を早くすること、or ADCの読取りチャネルを減らすことでの対応は出来ると思います。

単にUSBUARTでの送受信だけでのI/Oの為、Arduinoに限らず、UARTの送受信フォーマット、データの順番を守りさえすれば、他MCUでも、同等なことができるのでは?と思います。
また、高速に通信できるのであれば、I/O の本数、種類等々も変更が可能だと思います。
実際、参考記事LinuxCNC+Arduino内では、インターフェースの種類と本数を変更し、使用されてます。

上記PC側、シマリス技研さんの公開されているUbuntu12.04LTS上で動作するLinuxCNC2.6.8と、現在LinuxCNC.orgで公開されているLiveImege上の2.78での作動を確認しております。


BeagleboneBlack,Greenの場合。

手順はほぼ同じですが、arduino-VCP.hal ,同.xmlファイルを/home/machinekit上に置き、ターミナルでそのディレクトリに移動、halrunしてください。

halrun実行時、管理者権限(root)では無い状態で実行してください。(rootで実行出来ないことが有った為。)

こちらも、Jessie ,wheezyのMachinekitで作動を確認してますが、作動後の起動でVNC接続が上手くいかない場合が有ったので、試すには、お試しSDカードを作った方がよさそうです。


LinuxCNC、加工モーションに関するステッピングモーター、サーボ制御をフィードバック制御しています。(HALファイルにて、信号の繋ぎを見るとよく判ると思います)このフィードバックループの最大時間が1ms、逆に云うと、1ms以内のリアルタイムフィードバックループでモーションを制御しています。
LinuxCNCの本家ページ、その他Wiki等にも書いてありますが、USBインターフェース自体規格上、1ms以上の遅延を許可しているが為に、たとえそんな遅延が起こらない高速なUSB通信だとしても、フィードバックループの最大時間以上の規格となるので、USB接続での機器に加工モーション系の入出力信号を許可していません。
1ms以内のフィードバックループを回しているが為、Mach3やUSBCNC、その他NCコントローラーのように、モーションコマンドを貯めて(バッファリング)しての送受信ができません。

この、ArduinoのUSBIOですが、LinuxCNC内では、リアルタイムスレッドではなく、ユーザースレッドでの作動で、少々時間が遅れても構わない、スピンドルや集塵機のON OFF制御や、クーラントの制御、ヒーターの制御、または、手元に置くHandPulseGenerater等のコントローラーの接続、もし、AutoToolChengerなどが有るのなら、そのあたりのI/Oとしての使用が適していると思います。

ADCや、AnalogOut(PWM)の結構な量のデータ転送が出来るので、パイソンのスクリプトと、Arduinoのスケッチの変更(arduinoに限らず、他MCUでも)さえできれば、相当に有効だと思われます。
また、各種制御をHalMeterの数値やHalScopeのスコープのグラフを見ながら、作動させることができるので、色々な使い方ができると思われます。

テーマ : 自作・改造
ジャンル : コンピュータ

STM32F103C8T6でGRBL

EbayやAliで販売されている安価なSTM32F103C8T6が載った、STM32DuinoBlue Pillと呼ばれている青い小さなボードにて、GRBLが作動するようです。

参考(ebay)
STM32F103C8T6 ARM STM32 Minimum System Development Board Module For Arduino



動画自体、ソースからコンパイル、インストール、で、実際の作動迄をフォローしています。
動画コメント欄にソースのURLがあります。

usbcnc/grbl This is a port of GRBL 1.1 to STM32F103 target
上記のWiki

Githubから、クローンorダウンロードして、CooCoxにて、プロジェクトファイルを開き、そのままコンパイルして、書き込んでいるようです。

試しに同じように、ダウンロードしてCooCoxにてプロジェクトを開いてコンパイルしてみました。
書き込み器は、動画では、コレまたAliやEbayで安価に販売されているSTLinkのコピー?を使い書き込んでますが、私は秋月でも売っているSTM32のEvalボード上部に付いているSTLinkを使用し、IDEが吐き出す書き込み用のHEXファイルをSTマイクロご謹製のSTLinkUtilityで読み込み、書き込みしました。

動画上でも言っているのですがATMegaを使うオリジナルのGRBLのようにUSB-UART変換ICが使われる訳ではなく、STM32自体にあるUSBインターフェースを使い、USBのVertualCOMPortとしてPCに接続するため、もしかるするとSTM32 Virtual COM Port Driverのインストールが必要になるかもしれません。

このVCPを使用するので、今まで以上の速度での仮想COMポートでのUARTの送受信が可能となるようですが、一応今の所、GRBLの対人間のインターフェースであるUniversalGcodeSenderやbCNC等々、115200のボーレート迄しか対応してないご様子。

ATMegaでGRBLを使用しないで、STM32でGRBLを使用するメリットとして、上記のUARTの通信速度の上限が上がるのと、計算速度が上がるので、最大ステップ周波数が上がります。
基本的には元のGRBLと同じGコードパーサーと、モーションプランナーを使用している(と思われる)ので、元のGRBLと変わらない、といえば変わりません。

UniversalGcodeSenderとbCNCにて、接続し、動かしてみましたが、やはり、移植とゆうことで、シリアルコンソールに最初に出てくるメッセージは

Grbl 1.1e ['$' for help]

と、現行GRBLと同じ。使い勝手も同じです。
ただ、一応Edgeブランチとなっているので、できれば、ソースコードを確認しての使用が良いと思われます。

とりあえず、テケトーなGコードを動かしてパルスが出ていること、を確認しました。






MCU自体の性能に余裕があるので、ATMegaでのGRBLが一杯一杯でやってたことが余裕となり、各種機能が追加されることと思われます。


また、LPC1769上でも、動く?ようにgrbl-LPCとゆうものも。
こちらはGithub上の記述を見ると、Smoothieボード上でも動くご様子。
Smootheボード上で動くのであれば、以前試してみた、秋月で売っているLPCXpresso1769でも動くのでは?と思います。

GRBLやLinuxCNCのようにオープンソースで公開されているソフトウエア、折角制御内容がソースコードとゆう形で公開されているので、できるだけソースコードを読んで使っていけると良いだろうなぁと思います。

追記

備忘用
この記事を書いている時点でのSTM32を使用したGRBLのピン配置
ソースファイル内cpu_map.hの286行目より。

PoartA
0:X_Step
1:Y_Step
2:Z_Step
3:X_Direction
4:Y_Direction
5:Z_Direction
6:Stepper_Enable/Disable
7
8:SpindlePWM
9
10
11
12
13:SWD
14:SWD
15:Probe

PortB
0:Spindle_Enable/Disable
1:Spindle_Direction
2:Coolant_Flood
3:Coolant_mist
4
5:Control_Reset
6:Control_FeedHold
7:Control_CycleStart
8:Control_SafetyDoor
9:
10:X_Linit
11:Y_Linit
12:Z_Limit
13:
14:
15:

本文中のSTM32Duinoで使われているBlue~とゆうボードを使う場合、PortBのPin_2は、Boot1(基板上のジャンパの片方)に抵抗を介して繋がっているので抵抗前から引っ張り出す。








テーマ : 自作・改造
ジャンル : コンピュータ

GRBLがv1.1に。

Arduino、ATMega328を使ったオープンソースの3軸NCコントローラーのGRBLがv1.1にアップデート。

また、grbl-MegaとゆうArduinoMegaを使う方もアップデート。

中華通販を使うととても安価に入手出来るATMega。
コントローラー、ソフト、安価に構成できますが、ソースコードが公開されているとゆうことは、中身を確認して使ってね、とゆうこと。

上手に使っていきたいですね。

テーマ : 自作・改造
ジャンル : コンピュータ

GrblとUniversalGcodeSenderとの通信内容。

PSoC5LPにてUARTの送信内容を表示出来るものを作ってみたので、GrblとUniversalGcodeSender間の通信内容を表示してみました。
使用した液晶パネルは320x480でLCDパネルコントローラーはILI9481、16bitパラレル通信なもの。ebay等でArduinoMega用として、とても安価に販売されています。
通常このようなTFTLCDパネルの場合、3.3V電源で信号線も3.3Vの物が多いのですが、Arduinoでの使用を前提としているものは5V電源5V信号で、パネルの取り付いている基板上に、レベル変換用のバッファICが載っています。

こんなふうにせずとも、USBUARTをPCに複数繋ぎ、別ターミナルソフトウエアから、通信内容を読むことも可能だと思います。


通信内容についてですが、UniversalGcodeSender側からの?とゆう、CurrentStatusコマンドをじゅしんしたGrblは現在のGrblの状態を返しています。
Gコードを受信すると、okと返し、CurrentStatusがIdleからRunに変わり実行し始めます。

全てがUARTのアスキーコードによる文字列での通信です。







ですので、Grbl v0.9の場合、ボーレートを119200に設定したTeraTermなどの通信コンソールを使用して(もちろんArduinoIDEのシリアルモニタでも)単命令でのコントロールが可能です。

テーマ : 自作・改造
ジャンル : コンピュータ

ライセンス
アクセスカウンター
プロフィール

あきらひとし。

Author:あきらひとし。
木工用CNCルーターフレームと、ステッピングモータードライバを作ってみました。
たぶん記事は一般的な人には殆ど必要のない事ばかりなの、かも。

モーターは回るだけでも楽しい。制御(速度、トルク、位置)できるともっと楽しい!

メールフォーム

名前:
メール:
件名:
本文:

リンク
最新記事
カテゴリ
スポンサードリンク
スポンサードリンク 
スポンサードリンク
オンラインカウンター
現在の閲覧者数:
検索フォーム
RSSリンクの表示
最新トラックバック
最新コメント
月別アーカイブ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。