grblとbCNCを導入する。
■grbl
とりあえず、手持ちのArduino Unoにgrblを入れてみる。
githubの公式に行って、ソース一式をダウンロードし、Arduino IDEにライブラリ追加する。
そして、アップローダのスケッチを選択して流し込み。
Arduinoに慣れていたら難しいことは何もない。
本家か、「自作CNCマシン・レーザーカッターについて」をよく読めば大丈夫なはず。
https://github.com/grbl/grbl/wiki/Compiling-Grbl
https://cnc-selfbuild.blogspot.com/2016/12/grbl11_14.html
バージョンだが、0.9jか1.1がよさそう。
CNCシールドの基板改造が必要になるかもしれないが、なるべく新しいものということで1.1で進めることにする。
■bCNC
pythonに慣れている人ならすぐに導入できる。
pip3でbCNCをインストールして、あとは「python3 -m bCNC」とするだけ。
■接続テスト
ここまでうまくいったら、Arduinoをパソコンに繋いでbCNCを起動する。
grbl 1.1ならbauを115700にする。
これで、H/Wが揃えばパソコンからGコードを送り込み、自由に制御することができるはず。
Gコードの作成などは、後で考える。
以上。
松ログ ビザール電子機器研究所 の公式サイトです。 ギター向け電子機器、特に超小型の真空管アンプや超小型のエフェクターを中心に、私が欲しい!面白い!と思ったものを形にしていきます。 研究記録という位置づけで、電子工作、プログラミング、その他の試行錯誤、研究開発のログも残していきます。
2024年5月29日水曜日
格安3Dプリンタをレーザー加工機に作り変える(③ソフトウェア)
2024年5月28日火曜日
格安3Dプリンタをレーザー加工機に作り変える(②可動部分の用意、実験)
■解体
レーザー加工機を作るために、格安3DプリンタLabists X1を改造する。
元の制御基板と、エクストルーダー周りを取り除いて、X,Y,Z 3軸のステッピングモーターおよびリミットスイッチの配線だけにする。
リミットスイッチはマイナス側のみで、プラス側には存在しない。また付け足してもいいかも。
2系統の電磁石を、決まったパターンで励磁→待機→励磁→待機・・・とさせることで、モーターが正確に回転する。
| us | Hz | kHz | 近い音階 |
|---|---|---|---|
| 350 | 0.002857143 | 2.857142857 | ファ6~#ファ6 |
| 400 | 0.0025 | 2.5 | #レ7 |
| 500 | 0.002 | 2 | シ6~ド7 |
| 600 | 0.001666667 | 1.666666667 | #ソ6 |
| 700 | 0.001428571 | 1.428571429 | ファ6~#ファ6 |
以上、続きは大陸から部品が届いてから。
格安3Dプリンタをレーザー加工機に作り変える(①検討、買い物)
2024年4月21日日曜日
QMC5883Lは不安定?
ーーーーーー
2024/05/08追記:やはり原因はQMC5883Lだった。他は全て同じコードで、I2Cで地磁気を読む部分のみセンサおよびコードをLSM9DS1に置き換えると、少なくとも12時間連続動作させても問題ないことを確認。安物、コピーでもよい用途と、ダメな用途があるという学びになった。
ーーーーーー
GPSと方角ベースのナビを作るべくトライし続けているが、地磁気センサとのI2C通信が安定しないので、いつまで経っても先に進まない。
症状としては、起動後すぐは安定した速度で動作しているのだが、10分?60分?以上経過すると、徐々に地磁気センサからのX,Y,Z軸の磁気情報の読取が遅くなるというもの。
最初はプログラムのミスや外付け回路の不良を疑い、プログラムを書き換えたりI2Cのプルアップの値を変えたりして戦ってきたが、どの方法でも解消しない。
そもそもチップが悪いのではと考えて検索したところ、似たような症状の方を発見。
https://shinshu-makers.net/shinshu_makers/2019/10/02/%E3%80%90%E3%83%91%E3%83%AF%E3%83%BC%E3%83%A1%E3%83%BC%E3%82%BF%E3%83%BC2019%E3%80%91qmc5883l%E4%B8%8D%E8%AA%BF%E3%81%A7lsm9ds1%E3%81%AB%E4%BA%A4%E6%8F%9B%EF%BC%9Cimu%E3%81%A7ok/
やはり格安チップではダメということか?
似たり寄ったりだが、aitendoで買ったHMC5883Lで再トライすることにする。
2024年4月20日土曜日
RP2040でR-2R DACを試してみる
I2Sの勉強をしていたら、R-2RというDACのことを知った。
せっかくなので、試しに作って遊んでみる。
参考文献はこちら→https://www.mech.tohoku-gakuin.ac.jp/rde/contents/course/mechatronics/anadigi.html
上記サイトの上のほうの回路図にあるように、正確な抵抗のセットが2n本と、n個のDOがあれば、n bitのアナログ出力が作れるということ。
今回はDO4つ+R 3つ+2R 5つで、4bitを作ってみる。
Rの値は電源とマイコンの電流入出力能力を超えない範囲で選べばよいが、今回はわかりやすく1kΩと2kΩで作ってみた。
お行儀はよくないがGP18をLOWにしてGND代わりとしている。
GP21-24がDOで、A0で結果を読み取っている。
結果は以下のようになった。
ガタガタしているのは、抵抗のバラつき起因と思われる。
オーディオ用途で拘って作る人々は、チップ抵抗で16bit, 24bitを作って、抵抗器をやすりで削って微調整しているらしい。
一度トライしてみたい。
今回作ったものの精度はともかく、こんな簡単な回路でアナログ出力ができるというのは本当に面白い。
オマケで、結果の取得に使ったThonnyのコード。
汚いけどそのまま貼ります。
整数0~15を2bitの01の0埋め文字列に変換する部分、もっといいやり方がある気がするけど動けばいいやの精神。
import time
LED = machine.Pin(25, machine.Pin.OUT) # GP25をLEDとして出力端子に設定
GND = machine.Pin(18, machine.Pin.OUT)
GND.off()
bits = [
machine.Pin(24, machine.Pin.OUT)
,machine.Pin(23, machine.Pin.OUT)
,machine.Pin(22, machine.Pin.OUT)
,machine.Pin(21, machine.Pin.OUT)
]
VIN = machine.ADC(0)
conv = 3.3/65535
conv = 1
print("start")
print("----")
def v(order):
print(order, end="")
print(": ", end="")
for i in range(4):
if order[i] is "0":
bits[i].off()
else:
bits[i].on()
time.sleep_ms(10)
print(VIN.read_u16()*conv)
for i in range(2**4):
t = ("000" + str(bin(i)).replace("0b", ""))[-4:]
v(t)
2024年4月13日土曜日
トランジスタ2石とDO 1つでマイコンの電源自己保持
2024年3月24日日曜日
RP2040にてarudino-picoでWireを使うときの注意点
まず、ArduinoでRP2040を動かすにはMbed OS RP2040という公式系と、arduino picoというphilhowerさんが作ったバージョンがある。少なくともI2Cの使い方がそれぞれ違う。
公式版は、I2Cで任意のピンを使うのが難しいらしい。なので、arduino-picoを選ぶ。
そして、Wire/Wire1は、setup()やloop()のスコープ中でしか使えない。
グローバルスコープで使おうとすると、未定義となりうまくコンパイルできない。
RP2040-ZeroにてArduino IDEでI2Cを使うとき、micropythonの感覚で書くと失敗する。
こんなのにハマるのは私だけかもしれないが、誰かの役に立つかもしれないので一応公開しておく。
■OKのとき
#inclue <Wire.h>
void setup(){
Wire1.setSDA(14);
Wire1.setSCL(15);
}
■NGのとき
#inclue <Wire.h> Wire1.setSDA(14);
Wire1.setSCL(15); void setup(){ }
<ファイルパス>:18:3: error: 'Wire1' does not name a type
18 | Wire1.setSDA(14);
| ^~~~~
<ファイルパス>:19:3: error: 'Wire1' does not name a type
19 | Wire1.setSCL(15);
| ^~~~~
<ファイルパス>:20:3: error: 'Wire1' does not name a type
20 | Wire1.begin();
| ^~~~~
exit status 1
Compilation error: 'Wire1' does not name a type



