3Dプリンタのユニットを動かしてみたが、これをCNC3040につけて動かしたい。
machinekitで動かすために、通信手段をテストしてみた。
machinekitではM100-M199までがユーザ定義のMコードとして定義できる。
今回はBBBのP9.11を入力、P9.13,P9.15,P9.17を出力として、利用する。
なお、3Dプリンタの制御のためにarduino nano相当品を利用しているが、5V系なので、
フォトカプラにて、信号を分離した。おそらく様々な電源を利用しているので、
電圧が同じでもフォトカプラで分離したほうが良いと考える。
今回は、GNDも分けている。
これまでの設定ではP9.11が出力になっていたので、設定を書き換え、
デバイスツリーを再コンパイル、置き換えを行った。
以下を書き換えている。
0x070 0x27 /* #3D PRINTER READY, P9.11, gpio0.30 30, mode7 in */
および
ready3d {
gpio-name = "my_mill:ready3d";
gpio = <&gpio1 30 0>;
input;
};
次に.iniファイルも書き換える
公式の資料にあるようにmCodeのディレクトリを指定する。
プログラムと混ぜて設置するのであれば指定は不要。
[RS274NGC]
# File containing interpreter variables
PARAMETER_FILE = pru-stepper.var
USER_M_PATH = mCode
.iniファイルの下にmCodeディレクトリを作成した。
halファイルも変更する。
入出力のピンが増えているのでそれを反映させる。
loadrt hal_bb_gpio output_pins=107,109,113,117,212,221,222,223,213,215,217 input_pins=108,110,114,118,211
Mコードの動作を作成する。
ファイル名:M100
#!/bin/bash
# file to turn on pin 9.13
halcmd setp bb_gpio.p9.out-13 True
exit 0
ファイル名:M101
#!/bin/bash
# file to turn on pin 9.13
halcmd setp bb_gpio.p9.out-13 False
exit 0
ファイルのモードを変更し実行できるようにする。
chmod 755 M*
3Dプリンタ制御用のマイコンにテストプログラムを入れて確認を行った。
#include<Wire.h>
//D8 : IN (CONNECTOR 1, PIN64, P9.17, command2)
//D9 : IN (CONNECTOR 2, PIN62, P9.15, command1, OC1A)
//D10: IN (CONNECTOR 3, PIN60, P9.13, command0, OC1B)
//D11: OUT(CONNECTOR 4, PIN58, P9.11, printerReady, OC2A)
//D12: POWER SUPPLY TO LCD
#define I2Cadr 0x3e
byte contrast = 35; // コントラスト(0~63)
void lcd_contdata(byte x) {
Wire.write(0b11000000); // CO = 1, RS = 1
Wire.write(x);
}
void lcd_lastdata(byte x) {
Wire.write(0b01000000); // CO = 0, RS = 1
Wire.write(x);
}
// 文字の表示
void lcd_printStr(const char *s) {
Wire.beginTransmission(I2Cadr);
while (*s) {
if (*(s + 1)) {
lcd_contdata(*s);
} else {
lcd_lastdata(*s);
}
s++;
}
Wire.endTransmission();
}
// 表示位置の指定
void lcd_setCursor(byte x, byte y) {
lcd_cmd(0x80 | (y * 0x40 + x));
}
void lcd_cmd(byte x) {
Wire.beginTransmission(I2Cadr);
Wire.write(0b00000000); // CO = 0,RS = 0
Wire.write(x);
Wire.endTransmission();
//Serial.write(Wire.endTransmission() + '0');
}
void setup() {
// put your setup code here, to run once:
// put your setup code here, to run once:
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(8, INPUT);
pinMode(9, INPUT);
pinMode(10, INPUT);
pinMode(11, OUTPUT);
digitalWrite(12, HIGH);
digitalWrite(13, HIGH);
delay(1000);
Wire.begin();
Serial.begin(115200);
delay(500);
lcd_cmd(0b00111000); // function set
lcd_cmd(0b00111001); // function set
lcd_cmd(0b00000100); // EntryModeSet
lcd_cmd(0b00010100); // interval osc
lcd_cmd(0b01110000 | (contrast & 0xF)); // contrast Low
lcd_cmd(0b01011100 | ((contrast >> 4) & 0x3)); // contast High/icon/power
lcd_cmd(0b01101100); // follower control
delay(200);
lcd_cmd(0b00111000); // function set
lcd_cmd(0b00001100); // Display On
lcd_cmd(0b00000001); // Clear Display
delay(2);
}
void loop() {
// put your main code here, to run repeatedly:
int incomingByte;
char pinChar[4];
if(Serial.available() > 0){
incomingByte = Serial.read();
if(incomingByte == 'n'){
digitalWrite(11, HIGH);
pinChar[3] = '1';
}else if(incomingByte == 'f'){
digitalWrite(11, LOW);
pinChar[3] = '0';
}
}
pinChar[2] = (char)(digitalRead(10) + '0');
pinChar[1] = (char)(digitalRead(9) + '0');
pinChar[0] = (char)(digitalRead(8) + '0');
lcd_setCursor(4, 0);
lcd_printStr(pinChar);
}
hal meterや基板上のLCDで動作が確認できた。