クローン Prusa i3 MK3SのEinsyRambo にシリアルナンバーを書き込む

スポンサーリンク

複数台のPrusa i3 MK3Sプリンターをネットワーク経由で制御しようと思ったのですが、クローンPrusa i3 MK3Sの制御ボードにシリアルナンバーが入っておらず、Repetier-Serverからそれぞれのクローン Prusaを識別できない問題にぶつかりました。

公式サイトで購入したOriginal Prusa i3 MK3Sは、きちんとシリアルナンバーが入っています。

Original Prusa i3 MK3SをRaspberry piにUSB接続した状態で以下のコマンドを実行すると、正しくシリアルナンバーが表示されます。

$udevadm info -a -n /dev/ttyACM0
~~~~
    ATTRS{serial}=="CZPX****X004X******" ← シリアルが出力される

次にクローン Prusa i3 MK3Sを接続して確認しても、ATTRS{serial}がありません。

$udevadm info -a -n /dev/ttyACM1
~~~~
ATTRS{serial}がない。

Repetier-Serverは、このシリアルナンバーをユニークなキーにしてプリンターを識別しているようなので困りました。。

スポンサーリンク

で、困ったときのインターネットです。いろいろと禿げ上がりそうになりながら調べたところ、ありました!

同じ理由で識別できない問題を解決するためのツールを見つけました。

シリアルナンバーをEinsyRamboに書き込むツールになります。(世界は広いですね。)

https://github.com/middelink/EinsySerialnumber.git

※このツールは、EinsyRamboのROMを書き換えますので、最悪の場合、制御ボードが動かなくなる可能性がありますので、自己責任の上で行ってくださいね。

早速、上記ツールを利用してクローンPrusaにシリアルナンバーを書き込んで行きたいと思います。

用意するものは、Raspberry Pi(なんでもいいと思います。)とUSB AVRプログラマ USBasp AVRライタの2つになります。

今回は、Raspberry Pi 3とAmazonで購入したAVRライタを利用します。

まずは、EinsySerialnumberは、Go言語で書かれており、実行するにはコンパイルする必要がありますので、Raspberry PiにGoコンパイル環境をインストールします。

pi@develop:~ $ wget https://golang.org/dl/go1.15.12.linux-armv6l.tar.gz
pi@develop:~ $ sudo tar -C /usr/local -xzf go1.15.12.linux-armv6l.tar.gz
pi@develop:~ $ export PATH=$PATH:/usr/local/go/bin

arm版のGoコンパイラは、apt-getでインストールできないようなので、直接ダウンロードします。

pi@develop:~ $ go version
go version go1.15.12 linux/arm

go versionと入力されて、正しくversionが表示されればOKです。

次に、EinsySerialnumberを取得してコンパイルします。

pi@develop:~ $ git clone https://github.com/middelink/EinsySerialnumber.git
pi@develop:~ $ cd EinsySerialnumber/
pi@develop:~/EinsySerialnumber $ go build .

特に何も表示されなければビルドは成功です。同じディレクトリに、EinsySerialnumberファイルが作成されていると思います。

次にavrdudeをインストールします。

pi@develop:~/EinsySerialnumber $ sudo apt-get install avrdude -y

さらにavrdudeのconfファイルを取得します。

pi@develop:~/EinsySerialnumber $ git clone https://github.com/arduino/arduino-flash-tools.git

これで環境の準備は完了です。

※USBaspの出力が5vになっていることを確認してください。なっていない場合は、ジャンパーピンで変更します。

表の黄色いジャンパーピンで出力を変更できます。

次は、クローンPrusaのEinsyRamboボードのICSPピンにUSBaspを接続し、USB側をRaspberry Piに接続します。(念のためクローンPrusaの電源はOFFにして、USBの接続も外してください。)

接続ができたら、以下のコマンドで現在のROMを吸い出します。

pi@develop:~/EinsySerialnumber $ sudo avrdude -C arduino-flash-tools/tools_linux_arm/avrdude/etc/avrdude.conf -v -p atmega32u2 -c usbasp -P usb -U eeprom:r:32u2.eep:r

以下のメッセージが出力されれば、正常に吸い出しができています。

avrdude: Version 6.3-20171130
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch

         System wide configuration file is "arduino-flash-tools/tools_linux_arm/avrdude/etc/avrdude.conf"
         User configuration file is "/root/.avrduderc"
         User configuration file does not exist or is not a regular file, skipping

         Using Port                    : usb
         Using Programmer              : usbasp
         AVR Part                      : ATmega32U2
         Chip Erase delay              : 9000 us
         PAGEL                         : PD7
         BS2                           : PC6
         RESET disposition             : possible i/o
         RETRY pulse                   : SCK
         serial program mode           : yes
         parallel program mode         : yes
         Timeout                       : 200
         StabDelay                     : 100
         CmdexeDelay                   : 25
         SyncLoops                     : 32
         ByteDelay                     : 0
         PollIndex                     : 3
         PollValue                     : 0x53
         Memory Detail                 :

                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           eeprom        65    20     4    0 no       1024    4    256  9000  9000 0x00 0x00
           flash         65     6   128    0 yes     32768  128    256  4500  4500 0x00 0x00
           lfuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           hfuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           efuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           lock           0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           calibration    0     0     0    0 no          1    0      0     0     0 0x00 0x00
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00

         Programmer Type : usbasp
         Description     : USBasp, http://www.fischl.de/usbasp/

avrdude: auto set sck period (because given equals null)
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.01s

avrdude: Device signature = 0x1e958a (probably m32u2)
avrdude: safemode: lfuse reads as EF
avrdude: safemode: hfuse reads as D9
avrdude: safemode: efuse reads as F4
avrdude: reading eeprom memory:

Reading | ################################################## | 100% 0.61s

avrdude: writing output file "32u2.eep"

avrdude: safemode: lfuse reads as EF
avrdude: safemode: hfuse reads as D9
avrdude: safemode: efuse reads as F4
avrdude: safemode: Fuses OK (E:F4, H:D9, L:EF)

avrdude done.  Thank you.

同じディレクトリに、32u2.eepファイル名で吸い出したROMのeepファイルが作成されています。

pi@develop:~/EinsySerialnumber $ ls -la 32u2.eep
-rw-r--r-- 1 root root 1024  5月  9 10:59 32u2.eep

EinsySerialnumberを使って、現在のシリアルナンバーを確認します。

pi@develop:~/EinsySerialnumber $ ./EinsySerialnumber
Serial number:

現在は、まだ何も書き込んでいないので、空が正常です。

では、本命のEinsySerialnumberを使ってシリアルナンバーを書き込みます。

シリアルナンバーは、19文字にする必要があるみたいです。あとシリアルナンバーに利用できる文字の制限は不明のため、大文字と数字だけの方が安全かもです。

EinsySerialnumberを使って、シリアルナンバー「MIKANPARTNERS000001」を書き込みます。(root権限でromを吸い出したので、sudoを付与して書き込んでいます。)

pi@develop:~/EinsySerialnumber $ sudo ./EinsySerialnumber MIKANPARTNERS000001
Serial number: MIKANPARTNERS000001

正常に書き込まれると、「Serial number: MIKANPARTNERS000001」と書き込んだシリアルナンバーが表示されます。

pi@develop:~/EinsySerialnumber $ ls -la 32u2.eep
-rw-r--r-- 1 root root 1024  5月  9 11:13 32u2.eep

吸い出したeepファイルの更新日時も変わっています。

これでシリアルナンバーを書き込んだファイルの準備ができましたので、avrdudeとUSBaspを利用して、EinsyRamboボードに書き込みます。

pi@develop:~/EinsySerialnumber $ sudo avrdude -C arduino-flash-tools/tools_linux_arm/avrdude/etc/avrdude.conf -v -p atmega32u2 -c usbasp -P usb -U eeprom:w:32u2.eep:r

以下のメッセージが表示されれば、正常に書き込みが完了しています。

avrdude: Version 6.3-20171130
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch

         System wide configuration file is "arduino-flash-tools/tools_linux_arm/avrdude/etc/avrdude.conf"
         User configuration file is "/root/.avrduderc"
         User configuration file does not exist or is not a regular file, skipping

         Using Port                    : usb
         Using Programmer              : usbasp
         AVR Part                      : ATmega32U2
         Chip Erase delay              : 9000 us
         PAGEL                         : PD7
         BS2                           : PC6
         RESET disposition             : possible i/o
         RETRY pulse                   : SCK
         serial program mode           : yes
         parallel program mode         : yes
         Timeout                       : 200
         StabDelay                     : 100
         CmdexeDelay                   : 25
         SyncLoops                     : 32
         ByteDelay                     : 0
         PollIndex                     : 3
         PollValue                     : 0x53
         Memory Detail                 :

                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           eeprom        65    20     4    0 no       1024    4    256  9000  9000 0x00 0x00
           flash         65     6   128    0 yes     32768  128    256  4500  4500 0x00 0x00
           lfuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           hfuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           efuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           lock           0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           calibration    0     0     0    0 no          1    0      0     0     0 0x00 0x00
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00

         Programmer Type : usbasp
         Description     : USBasp, http://www.fischl.de/usbasp/

avrdude: auto set sck period (because given equals null)
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.01s

avrdude: Device signature = 0x1e958a (probably m32u2)
avrdude: safemode: lfuse reads as EF
avrdude: safemode: hfuse reads as D9
avrdude: safemode: efuse reads as F4
avrdude: reading input file "32u2.eep"
avrdude: writing eeprom (1024 bytes):

Writing | ################################################## | 100% 10.33s

avrdude: 1024 bytes of eeprom written
avrdude: verifying eeprom memory against 32u2.eep:
avrdude: load data eeprom data from input file 32u2.eep:
avrdude: input file 32u2.eep contains 1024 bytes
avrdude: reading on-chip eeprom data:

Reading | ################################################## | 100% 0.62s

avrdude: verifying ...
avrdude: 1024 bytes of eeprom verified

avrdude: safemode: lfuse reads as EF
avrdude: safemode: hfuse reads as D9
avrdude: safemode: efuse reads as F4
avrdude: safemode: Fuses OK (E:F4, H:D9, L:EF)

avrdude done.  Thank you.

さてさて、これでシリアルナンバーの書き込みは完了になります。

再度、USBにEinsyRamboボードを接続して、udevadmできちんとシリアルナンバーが書き込まれているから確認してみましょう。

$udevadm info -a -n /dev/ttyACM1
~~~~
    ATTRS{serial}=="MIKANPARTNERS000001" ← シリアルが出力される

ぉぉぉぉ!!。ちゃんと書き込んだシリアルナンバーが出力されるようになりました!

Repetier-Serverでも正しく認識していました!

かなりマイナーな内容ですが、困っている人がいれば何かの助けになればです。

EinsySerialnumberを開発した方に感謝感謝です。

スポンサーリンク