Gcodeに一時停止を含める

プリントプレビュータブの Edit G-Code で Gcodeに
@pause comment
を追記する.

シリアルモニタからint を受け取る

シリアルモニタから普通に1023等の文字列を送ったときにArduinoで数字として受け取る方法

int array[NUM] = {0} で全要素0埋め

int num;

void ReadSerial(){
  char incomingByte[BUFFER_SIZE] = {0};
  int byteCount = 0;

  if( (byteCount = Serial.available()) ){

    for(int i=0; i<byteCount; i++){
      incomingByte[i] = Serial.read();
    }

    num = atoi(incomingByte);

    Serial.println(num);
  }
}

音声ファイルを再生する

Javaで音楽を再生する必要があったのでこのブログを参考にさせていただいた.

nautilus2580.hatenablog.com

変更点はAudioFormatクラスからサンプルレートを取ってきて clip.start() をちゃんと待つようにしたことと,同期再生を追加したこと.

import java.io.File;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;

public class SoundPlayer{
    private AudioFormat format = null;
    private DataLine.Info info = null;
    private Clip clip = null;

    public SoundPlayer(String pathname){
        File file = new File(pathname);

        try{
            format = AudioSystem.getAudioFileFormat(file).getFormat();
            info = new DataLine.Info(Clip.class, format);
            clip = (Clip) AudioSystem.getLine(info);
            clip.open(AudioSystem.getAudioInputStream(file));

        }catch(Exception e){
            e.printStackTrace();
        }
    }
    
    //非同期再生 実行するとすぐ制御が帰ってくる
    public void play(){
        new Thread(){
            public void run(){
                playSync();
            }

        }.start();
    }
    
    //同期再生 再生が終わるまで帰ってこない
    public void playSync(){
        // time : 総サンプル数をサンプルレートで割った音声ファイルの時間[msec] 少数切り捨てされると途中で再生が止まるので Math.ceil で切り上げ
        long time = (long)Math.ceil(1000 * clip.getFrameLength() / format.getSampleRate() );
        clip.start();
        try {
            Thread.sleep(time);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    //再生位置を初期位置に戻す
    public void back2StartPos(){
        clip.setFramePosition(0);
    }

    //停止
    public void stop(){
        clip.stop();
    }
}

以下のコードで再生できる

SoundPlayer sp = new SoundPlayer("sound.wav");
sp.playSync();
sp.play();

繰り返し再生するときは

SoundPlayer sp = new SoundPlayer("sound.wav");
while(true){
    sp.playSync();
    sp.stop();
    sp.back2StartPos();
}

でうまくいった.stop() なしだと再生されたり再生されなかったりした.
毎回インスタンスを生成しても連続再生はできた.

ホットエンド 温度センサの位置変化による温度変化

自分の3Dプリンタでは一日のうちに何度もうまく印刷できる温度が変化する.
気温の変化のせいかと思っていたがそれだけでなく,動作中にホットエンドのサーミスタが動くことによって測定温度が大幅に変わってしまうことも大きな要因であることがわかった.

何とかしてサーミスタを固定しなければ

Arduinoのファームウェアを書き換えても設定が反映されない

ノズルを変えてZプローブオフセットを変更する必要があったので,設定を変更してMarlinを書き込んだが,設定が反映されずノズルをベッドに突っ込ませてしまった.
M851コマンドで確認してもオフセット値が更新されていなかった.

原因はEEPROMに設定を保存するようにしていたことだった.
Repetier-Host の ファームウェアEEPROM設定 から 初期値に戻す で設定が更新された.

3Dプリンタ 射出不良(PTFEチューブ)

射出不良が発生したのでエクストルーダーを分解すると,PTFEチューブの内側,外側にフィラメントが入り込んで穴を塞いでいた.
さらにPTFEチューブも収縮してしまっていたので交換した.

今回はPTFEチューブが少し短めだった.
PTFEチューブはスロートチューブの際までしっかり長さを取るように言われているのはこういうことだったのか.