2013/09/29

3Dプリンタ Solidoodle3 を購入

去年・今年と話題になっている3Dプリンタ、私もとうとう買ってしまいました。
先週注文したので来週か再来週には到着するはずです。

Solidoodle

今では国内外たくさんのメーカーから3Dプリンタが出ていますが、値段と販売実績、作成出来る最大サイズ、サポートしているフィラメントの種類、納期を勘案してSolidoodleを選びました。
今回買ったものは3世代目で、前の世代よりも3万円ほど値段は上がっています。が、2世代目のフィードバック等も含まれているはずと期待して3世代目を購入しました。

購入方法ですが、Solidoodleは代理店契約を一切行わない方針のようなので、どの国から購入する場合もSolidoodleのオンラインストア経由です。 Solidoodle 3GとABSフィラメント1kGを1個ずつ購入して送料込みで$950程度でした。
届いてから消費税の請求が別途来るようなので、日本円だと合計で11万円ぐらいになるでしょうか。10万円を超す趣味のモノを購入するのは数年ぶりです。

購入した動機は以下の通り。
  • 自作LEDライトが基盤剥き出しなのでそれ用のケースを作りたい
  • 木やプラスチックの塊を削っていくのはシンドイし、ゴミも出る
  • CupCake CNCが出た頃はとても買えそうになかったが、今ならいけるかも
  • Amazonが3Dプリンタストアをオープンした
  • 先人の方の3Dプリンタについての記事が増えてきた
  • 新しいオモチャがほしい!

さて、出力の3Dプリンタが届いたとしても入力データがなければただの大きな箱です。
2Dプリンタの入力データは画像やテキストですが、3Dプリンタの入力データはCADなどで作るモデリングデータです。Thingiverseなどに公開されているモデリングデータをもらってくるのも良いのですが、さすがに自分で作った(もしくはこれから作る)いろいろな電子工作物のケースは公開されていません。

モデリングデータを作るために、AutoCADの Inventor Fusion 2013という無料で使える3DCADをPCにインストールしました。Windows用とMac用があるので便利です。

今はYoutubeに載っているチュートリアルなどを見ながら使い方を練習しています。
まずは比較的簡単そうなBeagleBoneとArduinoのケースを作ってみたいと思います。

ではまた。

2013/09/03

BeagleBone+pythonでI2C液晶を動かす

BeagleBoneからI2C液晶を制御するライブラリをpythonで作りました。
Raspberry PiでI2C液晶を制御するコードを参考にしています。


#!/usr/bin/env python
# -*- coding:utf-8 -*-

"""
秋月電子で販売されている
I2C接続小型LCDモジュール 8x2行
用のスクリプトです。
ストロベリーリナックスで販売されている
I2C低電圧キャラクタ液晶モジュール(16x2行)
も動かせると思います。

"""

import smbus    # sudo apt-get install python-smbus
import time

class i2cLCD:
    
    i2c = smbus.SMBus(2)
    addr = 0x3e
    lineCount=2
    charCount=8
    cursorEnable=0
    blinkEnable=0    
    
    def _writeControlByte(self,val):
        self.i2c.write_byte_data(self.addr,0,val)

    def _writeByte(self,val):
        self.i2c.write_byte_data(self.addr,0x40,val)

    def _IS0(self):# Instruction Set 0
        self._writeControlByte(0x38)# function set(IS=0)

    def _IS1(self):#Instruction set 1
        self._writeControlByte(0x39)# function set(IS=1)

    def initialize(self):
        self._IS0()
        self._IS1()
        self._writeControlByte(0x14)# internal osc
        self._writeControlByte(0x70)#contrast
        self._writeControlByte(0x56)#icon contrast
        self._writeControlByte(0x6c)# follower control
        time.sleep(0.2)
        self.clear()

    def clear(self):
        self._writeControlByte(0x0F)    # Display,cursor on
        self._writeControlByte(0x01)    # Clear Display
        self._writeControlByte(0x06)    # Entry Mode to normal
        time.sleep(0.2)
    

    def setCursor(self,cursorEnable,blinkEnable):
        c=0x0
        b=0x0
        if(cursorEnable):c=0x02
        if(blinkEnable):b=0x01
        mode=0x0C|c|b
        self._writeControlByte(mode)
        self._writeControlByte(0x06)
    
    def puts(self, msg):
        for c in msg:
            self._writeByte(ord(c))
 
    def moveTo(self, line, col):
        if(line<0): line=0
        if(col<0): col=0
        if(line>=self.lineCount): line=self.lineCount-1
        if(col>=self.charCount): col=self.charCount-1
        line=line*0x40
        self._writeControlByte(0x80 | line | col)
    
    def scroll(self,msg):
        self.clear()
        self.moveTo(0,0)
        self.puts(msg)
        sz=len(msg)
        self._IS0()
        time.sleep(1)
        for i in range(sz):
            self._writeControlByte(0x18)# Display left shift
            time.sleep(0.5)
        for i in range(sz):
            self._writeControlByte(0x1C)#Display right shift
        self.clear()

    def doubleHeightScroll(self,msg):
        self.clear()
        self.moveTo(0,0)
        self._writeControlByte(0x34)#double hight mode
        self.puts(msg)
        self.setCursor(0,0)
        sz=len(msg)
        time.sleep(1)
        for i in range(sz):
            self._writeControlByte(0x18)# Display left shift
            time.sleep(0.5)
        for i in range(sz):
            self._writeControlByte(0x1C)#Display right shift
        self.clear()
        self.setCursor(0,0)

    def setCGRam(self,cgAddr,values):
    #0x40が SET CGRAM Address
    #6ビットのうち上位3ビットがCGRAMのアドレス(0-5まで)
    #下位3ビットがCGの上から何行目かを表します。
        self._IS0()
        if(cgAddr>5):
            cgAddr=5
            print('CG addr must 0 to 5 ')
        lcd._writeControlByte(0x40|cgAddr<<3)#set CGAddr
        for val in values:
            lcd._writeByte(val)
            binval=format(val,'08b')
            binval=binval.replace('0',' ')
            binval=binval.replace('1','#')
            #print binval

if __name__ == "__main__":
    lcd = i2cLCD()
    lcd.initialize()
    lcd._IS0()
    lcd.doubleHeightScroll('Welcome to BeagleBone!')

Ubuntu13.04のKernelは3.8なので仮想CAPEを登録する作業が必要です。

 sudo -s
 cd /sys/devices/bone_capemgr.7 (数字は環境によって異なります)
 echo BB-I2C1 > slots
 dmesg | grep capemgr

データシートを見ると、縦2文字分を使用して1文字を表示するDouble Heightモードがあったので
使ってみました。


また、カスタムアイコンを6つまで作れるので、4文字または6文字分を使って漢字を表示できるかな?と思い実験をしましたが、文字間のタテヨコの空白部分がどうしても気になってしまう形になってしまい、無理があると判断しました。漢字だと隙間ナシで16x16は無いとダメみたいですね。

もうちょっと高解像度の液晶を探そうかな。