フォト
2025年2月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28  
無料ブログはココログ

Propeller

2019年3月12日 (火)

プロペラ2の評価ボード

個人的に注目している、8コア搭載プロペラの時期バージョン、プロペラ2がやっと完成し、評価ボードでたようです。

 ・Propeller 2 ES Evaluation Board
  ・Propeller 2

03

評価ボードなので、数量限定で高いし入手も出来ないです。
まあ、ライブラリやドキュメントも整備されていないのでまだまだ様子見です。

01

ボードは回るプロペラを意識した感じのレイアウトです。
コネクタ群が8個あり、おそらく1つのコネクタ群に1コアが割付くイメージなのでしょう。

02

各コネクタ群には、様々なモジュールを接続して利用出来るようです。

プロペラ1では、各コア毎にビデオ出力機能(ビットストリーム)を搭載していたのですが、
プロペラ2では、更に強化されており、各コア毎に独立したDA、ADコンバータが乗っています。

プロペラ1ではビットデータのストリーミングを抵抗分圧でアナログ値にして合成して
ビデオ出力を行っていたのですが、プロペラ2では、直接アナログ出力が出来ます。
デジタルのビデオ出力に対応しています。

マルチコアで各コアが独立して稼働、USBホスト機能搭載、
様々なメディアからの起動が可能で、なんでもありのボードです。

かなり面白いこと(映像やサウンドで遊ぶ)が出来そうです。
ゲームコンソールなんかにも使われるかもしれません。


2018年7月25日 (水)

プロペラでVT100端末の実装

SNSにてシリアル・ターミナル コンソールをマイコンで実装する話題があり、
「そういえば、プロペラマイコンでVGA+PS/2キーボード構成が簡単に実装出来るなぁ」
と思い出し、やってみました。
久しぶりのプロペラマイコン利用です。

Dscn8443

ゼロからの自作は無理なので、mikrocontroller.netVT100-Terminal (VGA+PS2)
にて紹介されている、「RETROCOMPUTING VT100 VIDEO TERMIAL」を
利用して実装しました。

ソースや回路図等は上記フォーラムに掲載されているリンク先から入手しました。
  ・https://www.mikrocontroller.net/svnbrowser/avr-cp-m/trunk/VT100/


回路図を見ると、キーボードやVGA周りの実装は、
プロペラのデータシートに掲載されているデモボードと同じようです。
比較的少ない部品で実装出来ました。

Dscn8440

一応、これで640x480ドット 80x25文字、 64色同時表示のVGA表示が出来ます。
キーボードはPS/2インタフェースとなります。
シリアル接続のターミナル コンソール VT100相当として利用出来ます。

動作確認に、Arduino Uno互換機にて「豊四季タイニーBASIC for Arduino機能拡張版」
動かしてみました。

本来はパソコン上でTeraTarmの利用を想定しているのですが、
果たして使い物になるでしょうか?


動作確認の様子


予想以上にまともに動作しました。
表示もNTSCとは異なり、非常に綺麗です。

カラー表示も出来ました。
意外と使えそうです。

他にもプロペラを使った類似のものが公開されているので、もう少し調べてみます。

2018/07/28 補足

開発環境はPropeller IDEを利用しています。
こんな感じのツールです。言語としてはSPINというインタプリタ言語が標準です。

Ide

出回っているプログラムは、旧開発環境のPropeller Toolを使っている場合があります。
その場合、Propeller IDEではコンパイルに失敗する場合があります。
Propeller Toolもインストールして、Propeller IDEのライブラリパスの設定にて、
Propeller Toolの付属ライブラリにパスを通す必要があります。


関連記事
Propeller始めました(8) スピーカーで音を出してみる (2015.11.30)
Propeller始めました(3) VGA出力を試してみる (2015.11.14)
Propeller始めました(2) TV出力を試してみる (2015.11.12)

2016年2月19日 (金)

Propeller始めました(22) ポータブルゲーム機の実装 7

先日実装したSDカードモジュールを早速活用して、MIDIファイルの再生実験をやってみました。


Parallax のForumの次の情報と公開ライラリを利用して実装しました。
  ・Music Synthesizer object with General MIDI sound set
    http://forums.parallax.com/discussion/111867/music-synthesizer-object-with-general-midi-sound-set

CPUだけで、そこそこの音が出ています。専用の音源ICを搭載しようかとも思ったのですが
不要ですね(デジカメで撮影したのでドラム音とかが拾えていないです)。

仕様的には、ソース内に次のような記載があります。

01

20音同時再生できるようです。音色もGM1サウンドセット+GM1ドラムセットをサポート
しているみたいです。

プログラム開発者が公開している実演奏(mp3形式)のを聞くと、かなり綺麗な音です。
スピーカーが悪いのか、もっと良い音が出るようです。

フォーラムを見ているとSDカードや音源処理でChaNさんの記事の引用が多いです。
ChaNさんの「ELM - 楽しい電子工作  オーディオ関係」等、色々と勉強になる記事が多いです。

Parallax Propeller関連の情報は少ないですが、量より質的のよい的な感じで色々と
勉強になります。

2016年2月17日 (水)

Propeller始めました(21) ポータブルゲーム機の実装 6

注文していたmicroSDカードもージュールが到着したので早速使ってみました。
基板上に抵抗やコンデンサが乗っているので、3.3V系のマイコンではSPI接続で
簡単に利用することが出来ます。5個で$2.98は非常に安いです。

01

到着した製品はこんな感じです。SDカード入れてみるとプッシュして飛び出す形式ではなく
取り出し時は引っ張って取り出します。

Dscn4892

5品をSPI接続にて動作確認して特に問題無し。
早速、LameStationの拡張端子に直接差し込んで利用するための基板を作成しました。

Dscn4897

SDカードだけでSPIを利用するのはもったいないのでSPI接続 16Mバイトフラッシュメモリ
も一緒に乗せました。

Dscn4900

片面基板をピン端子に接続するために、秋月電子で購入した基板用リードフレームを
利用しました。

02

若干、ピンが細くてピンソケットに挿すと緩いので、ハンダでコーティングして厚さを
増強しました。

基板用リードフレームは材質はICのピンと同じ感じなので強度的に心配がありますが、
ピンヘッダが取り付け出来ない片面基板には重宝します。

次に動作確認です。
問題無し。良かった、一発で動作しました。
これでブレッドボードによる外部回路が無くなりすっきりしました。

Dscn4902

せっかく、ここまでやったので以前作成したランチャープログラムの異常系の実装に
着手しました。

異常系として、
  SDカードリーダが無し
  SDカードが刺さっていない状態、
  SDカードがFAT形式でないケース
  SDカード内にあるべきファイルが無い
  液晶モジュールが接続されていない
等です。

これらの異常環境をわざと起こして、実験していたのですが、
本日初めてspin言語に異常等の例外を捕まえる機構があることを発見しました。

今まで、異常発生時にフリーズしてしまうことがあったのですが、
これは異常発生におけるabort状態だったのでした。

このabort状態をキャッチして異常発生の対応が可能です。しかも実に簡単です。

LameLCD液晶表示ドライバの例
  if false == \lcd.Start(gfx.Start)
        cm.Str (String("LCD devie error.",13))

メソッドの前に’\’(半角バックスラッシュ)を付けることでそのメソッドまたは、
その下位のメソッド内のメソッド終了命令abortをキャッチできます。
逆に’\’を付けないとabort命令によりabort状態となり次の処理も実行できません。
見た目上はフリーズした感じになります。

通常はメソッドの実行を終了する場合はreturnを使います。この場合は呼び出し元に
戻りますがabortを使って終了する場合はabort状態となり’\’を使った呼び出し
レベルまで戻ります。’\’を使っていない場合はメインの処理も終了となります。

この機構をもう少し早く知っていれば、異常系の実装の他にデバッグやテストで
もう少し楽が出来ていました。
abortをキャッチしないのでフリーズしたと勘違いしていたケースもあります。

以前作成したライブラリは全くこの機構を使っていないので、見直しと修正が必要です。

標準ライブラリもこの機構を意識して作られています。
SDカード用のライブラリはメソッド内で異常が発生した場合、エラーコードとエラーメッセージを
セットしてabortしてくれています。最上位の一か所でabortをキャッチしてセットされた
エラーメッセージの表示するだけで異常の状況が分かります。

試し異常系として
異常系として、
  SDカードリーダが無し
  SDカードが刺さっていない状態、
  SDカードがFAT形式でないケース
  SDカード内にあるべきファイルが無い
をやってみると、その状況と分かるエラーメッセージが表示出来ました。

SDカードリーダ部(今回作成したモジュール)を取り外してプログラムを実行すると
次のようなメッセージ(2行目の内容)が表示れれました。

Dscn4908

この機構、異常系の状況検出において非常に強力な機能です。
メソッドやライブラリを自作する場合、returnとabortを使い分けることで異常系の
実装もきちんと行えます。

そういえば、arduinoで例外処理(Try Catch Exception)を利用したことがないなぁ
今度使う時は意識してプログラミングをしてみよう。

2016年2月14日 (日)

SPI接続のカラー液晶モジュールの動作確認

Aliexpressで安価なカラー液晶モジュールを入手しました。
LCDコントローラとしてILI9341を採用しているモジュールです。
製品としてはSDカードスロット付き、タッチパネル機能が無いものです。

2.4" 240x320 SPI TFT LCD Serial Port Module 3.3V PBC Adapter SD ILI9341

2.4

安いので、あまり期待していなかったのですが、視野角・発色も良く良い製品でした。
ただし、2.4インチだと若干小さいです。一回り大きい2.8インチ、3.2インチでもよかったかも..

arduino Unoでの動作確認
動作確認には下記のスケッチを利用しました。
  Adafruit 2.8" TFT Touch Shield v2 - Graphics Test
  https://learn.adafruit.com/adafruit-2-8-tft-touch-shield-v2/graphics-test

Arduino IDE 1.06では、コンパイルするとエラーが発生します。
関数 yield() が利用出来ないようです。Arduino IDE 1.6.7では問題ありませんでした。

Arduino UNO

製品としては問題なく動作しました。表示も速いです。

次に、プロペラ(Parallax Propeller)にて試して見ました。
動作確認には次の公開ソースを利用しました。
  Propeller Object Exchange - ILI9341 SPI driver
  http://obex.parallax.com/object/723

配線においてちょっと悩みました。サンプルプログラムではピン接続が次のように
なっているのですが、nRESET と RS が何処に接続するのは今一分かりません。

nRESET= 22

RS = 23

nCS = 24

MOSI = 25

SCLK = 27

MISO = 26

色々試してRS は 製品ボード上のD/Cピン、 nRESETは RESET と判明しました。

Propeller

現在製作中のLameStationも次期バージョンはカラー液晶にしても良いかも..

2016年2月10日 (水)

Propeller始めました(20) ポータブルゲーム機の実装 5

前回ランチャーメニューを作ったのですが、英語だとちょっと表示が寂しいので、
日本語表示が出来たらいいなぁと思いやってみました。

取りあえず、日本語表示部分の仮実装が出来ました。

Dscn4850

方式としてはSDカード上に漢字フォントデータファイルを置いておいて、該当文字コードの
フォントを取得して液晶ディスプレイに表示するという感じでやってみました。

今後の拡張を考えて、文字コードはUTF8を使っています。
SDカード内のテキストファイルを読んで表示なんかもやってみたいです。

フォントの表示はLameStationのスプライト表示機能にて行っているので、
やろうと思えば1文字単位で”うねうね”と動かすことも出来ますね(たぶん)。

日本語表示部分は次のような感じです。

PUB demo4
    setPos(0,0)
    setFontSize(24)
    setColor(0,1)    
    addHSpace(4)
    Str(String("日本語表示"))
    newLine   
    setFontSize(12)
    setColor(1,0)
    addSpace(2,2)
    Str(String("取りあえず出来ました。"))
    newLine   
    setFontSize(10)
    addSpace(2,2)
    Str(String("UTF8・マルチフォント対応!"))
    newLine   
    addSpace(4,2)
    Str(String("ただし半角カタカナ非対応")) 
    lcd.DrawScreen  

面倒な座標指定を減らす感じにしています。

次のステップとしては、これをライブラリ化して、動作確認として
SDカード上の日本語テキストファイルを読んで表示するなんてのをやろうと思います。
テスト後はランチャーメニューの日本語化をやります。


2016年2月 5日 (金)

Propeller始めました(19) ポータブルゲーム機の実装 4

実質的にSDカードからブードが出来ることが分かったので、今度はブートするプログラムを
選択できるランチャーメニューを実装しました。

ランチャープログラムはEEPROM上に書きこみます。
ハードウエア的にリセットがかかるとEEPROM上のランチャーメニューが起動します。

ランチャープログラムは、選択されたプログラムをSDカードからロードしてメインRAM
に書きこみます。その後ソフトウェアリセットにより、ロードしたプログラムが実行されます。

Dscn4830

操作としては、
ジョイスティック操作でメニューをスクロールさせて起動したいプログラムを選択します。
選択中のプログラムの説明を下段に表示します。

リセットボタンを押すことランチャープログラムがロードされて、メニュー画面に戻ります。

実際の操作の様子
(デジカメでの動画撮影なのでちょっと映像が劣化しています)


メニューに表示されるプログラム一覧は、SDカード内のテキストファイルに定義して
います。ランチャープログラムがその内容を読んで表示します。

ランチャーさえあれば、簡単にプログラムの入れ替えが出来ます。
SDカードだとプログラマやシリアル接続不要ですね。
こほ方式は色々と使えそうです。

ランチャープログラムのソースはこんな感じです。

{{
    LameStation SDカードローダー
}}

CON
    _clkmode        = xtal1 + pll16x
    _xinfreq        = 5_000_000
  
    'SDカード PIN接続
    sdDO  = 16        'EX0(P16)
    sdCLK = 17        'EX1(P17)
    sdDI  = 18        'EX2(P18)
    sdCS  = 19        'EX3(P19)

VAR
    'メニュー情報
    byte    text[2048]  'メニューファイルバッファ
    long    index[32]   'インデックス
    long    count       '登録数
    long    pos         'メニューファイルバッファ用ポインタ

    'メニュー表示用
    long    mnTop       'タイトル表示開始先頭番号
    long    mnSelect    'メニュー上の選択位置(0~3)

OBJ
    cm          : "LameSerial"
    sd          : "SD-MMC_FATEngine"
    lcd         : "LameLCD"
    gfx         : "LameGFX"
    txt         : "LameText"
    fn          : "LameFunctions"
    ctrl        : "LameControl"
    font_6x8    : "gfx_font6x8_normal_w"
    font_6x8b   : "gfx_font6x8"
    font_4x6    : "gfx_font4x6"

PUB Main | ctrlChange,prevCtrl,ctrlCode,fname,p
    mnTop := 0          'ランチャーメニューリスト先頭
    mnSelect := 0       '選択カーソル先頭
    prevCtrl := 0
    ctrlCode := 0
    cm.Start

    lcd.Start(gfx.Start)        
    gfx.ClearScreen(0)
  
    count:= LoadMEnu    'メニューデータをSDカードからロード
    DrawMenu            'ランチャーメニュー表示

    'ランチャーメニュー 操作
    repeat
        '操作状態取得
        ctrl.Update     
        prevCtrl := ctrlCode
        if ctrl.B 'タイトルを選択決定した
            p:= index[mnTop+mnSelect]
            repeat while text[p++] <> 0 
            fname := @text[p]
            quit           
        if ctrl.Down
            ctrlCode := ctrl.Down
        elseif ctrl.Up
            ctrlCode := ctrl.Up
        else
            ctrlCode := 0       
        if prevCtrl <> ctrlCode
            '操作に変化があった場合は表示の更新を行う             
            if  ctrl.Down 
                if mnSelect < 3
                    mnSelect++
                else
                    if mnTop < count-4
                        mnTop++
                    else
                        mnTop := 0
                        mnSelect := 0 
            if ctrl.Up
                if mnSelect > 0
                    mnSelect--
                else
                    if mnTop > 0
                        mnTop--
                    else
                        mnTop := count-4
                        mnSelect := 3
            if ctrlCode <> 0
                DrawMenu 
   
    Run(fname)

'メニュー画面表示
PUB DrawMenu |title,fname,info,i,p
    'メニュー部    
    gfx.ClearScreen(0)
    txt.Load(font_6x8b.Addr, " ", 6, 8)
    txt.Str(string("[Menu]"),0,0)
    
    'タイトルリスト部
    txt.Load(font_6x8.Addr, " ", 6, 8)
    repeat i from mnTop to (mnTop+4 <# count)-1               
        title := @text[index[i]]
        if (i<10)
            txt.Dec(i,12, 8 + (i-mnTop)<<3)     
        else
            txt.Dec(i, 6, 8 + (i-mnTop)<<3)     
        txt.Str(String(":"), 17, 8 + (i-mnTop)<<3)
        txt.Str(title, 23, 8 + (i-mnTop)<<3)
    txt.Str(String("*"), 0, 8 + (mnSelect)<<3)
       
    '選択したタイトルの説明表示
    p:= index[mnSelect+mnTop]
    repeat while text[p++] <> 0 
    repeat while text[p++] <> 0 
    txt.Load(font_4x6.Addr, " ", 4, 6)  
    txt.box(@text[p],0,40,128,18)    
    lcd.DrawScreen    

'指定イメージファイルによるブート
PUB Run(filePathName) : statusVal | statusStr 
  ifnot sd.partitionMounted
    Mount(0)

  statusStr := \ sd.bootPartition(filePathName)
  statusVal :=   sd.partitionError

PRI Mount(partition) : statusVal | statusStr
  ifnot sd.CogStatus
    Start    
  statusStr := \ sd.mountPartition(partition)
  statusVal :=   sd.partitionError

PRI Start : okay | statusStr     
  ifnot sd.CogStatus
    okay := sd.FATEngineStart(sdDO, sdCLK, sdDI, sdCS, -1, -1, -1, -1, -1)

'SDカードからメニュー情報を取得する
PUB LoadMenu | d,i
    pos  := 0
    i := 0

    'SDカードのマウント
    sd.fatEngineStart(sdDO, sdCLK, sdDI, sdCS, -1,-1,-1,-1,-1) 
        sd.mountPartition(0) 
    if strcomp( sd.listEntry(@myfname), @myfname )
        abort

    'メニューファイルのオープン    
    sd.openFile( @myfname, "R" ) 
    if sd.partitionError
       cm.Str( string("File I/O Error.",13) )
       abort
    
    'データの読み込み
    index[i]:=0
    repeat while d := sd.readByte    
       if d == "|" 'カラム区切り
            text[pos++] := 0                  
       elseif d == $0a 'LFは行終端
            text[pos++] := 0
            index[++i]:= pos
       elseif d => 32  'CRはスキップ '通常の文字    
            text[pos++] := d
   
    'ファイルのクローズ
    sd.closeFile
    
    'パーティションのアンマウント
    sd.unmountPartition 
    'エンジン解放
    sd.FATEngineStop
    result := i+1

DAT
'ファイル名
myfname         byte "menu.txt",0    

2016年2月 1日 (月)

Propeller始めました(18) ポータブルゲーム機の実装 3

プロペラを使ったポータブルゲーム機 LameStationにmicroSDカードを搭載しようと挑戦中です。

Dscn4822

オリジナルのLameStationはプレイするゲームを変更するたびにパソコンに接続して
開発環境でコンパイルして書き込む必要があり、少々使い勝手が悪いです。

何とかmicroSDカード上の任意のイメージファイルを選択してブートする方法は無いかと
試行錯誤中です。

取りあえず、SDカードは認識してファイルのアクセスは出来るようになりました。
秋月電子のマイクロSDカードスロットDIP化キットを使って下記のような感じの回路を
ブレッドボード上に実装して接続しました。

回路図はparallax社のホームページで公開している「SD Card Data Storage」
参考にしました。

SDカードからのブートについては、microSDカードリーダ搭載の純正ボードの
"Propeller Board of Education "にて実現可能な記事を見つけました。
記事:  Make One Program Launch Another

流用で出来そうです。何とかなりそうです。
プロペラってこんなこと出来るんですね。

話変わって、"LameStation"の"Lame"ってどういう意味かを調べたら、"不自由な"
っていう意味合いなのですが、確かに不自由と言えば不自由か..

2016/02/02 追記
SDカードからのブートが出来ました。プログラムはライブラリの関数を利用することで
簡単に実現出来ました。プログラムは次のような感じです。

{{
    LameStation SDカードローダー
}}

CON
    _clkmode        = xtal1 + pll16x
    _xinfreq        = 5_000_000
  
    'SDカード PIN接続
    DO  = 16        'EX0(P16)
    CLK = 17        'EX1(P17)
    DI  = 18        'EX2(P18)
    CS  = 19        'EX3(P19)

OBJ
  sd   :   "SD-MMC_FATEngine"

PUB go
  Run(String("TANKBA~1.EEP"))

PUB Run(filePathName) : statusVal | statusStr 
  ifnot sd.partitionMounted
    Mount(0)

  statusStr := \ sd.bootPartition(filePathName)
  statusVal :=   sd.partitionError

PRI Mount(partition) : statusVal | statusStr
  ifnot sd.CogStatus
    Start    
  statusStr := \ sd.mountPartition(partition)
  statusVal :=   sd.partitionError

PRI Start : okay | statusStr     
  ifnot sd.CogStatus
    okay := sd.FATEngineStart(DO, CLK, DI, CS, -1, -1, -1, -1, -1)
 

ライブラリではロングファイル名に対応していないため、8.3形式のファイル名で
ファイルを指定する必要があります。
8.3形式のファイル名はWindowsのコマンドプロンプトで"dir /X"で確認できます。

下記の写真はSDカードから起動した様子です。

Dscn4824

SDカードは容量4Gバイト FAT16です。
起動するプログラムはSDカード上にEEPROMイメージの形式のファイルとして
"TankBattle.eeprom"というファイル名で書きこんでいます。
8.3形式のファイル名だと"TANKBA~1.EEP"となります。

EEPROMイメージの形式の作成は、開発環境にて出来ます。
ただし、私が使っている PropellerIDE で作成したイメージではブート出来ませんでした。
Parallax社純正の開発環境 PropellerToolで作成すると正常起動しました。

一々別の開発環境で作成するのも面倒なので、openspinというコマンドラインで
利用するコンパイラを利用することで作成することにしました。バッチコマンドを作成して、
そのコマンドにソースのアイコンをドロップすることで簡単に作成できるようにしました。

バッチファイル makerom.bat

中身

openspin %1 -e -L "C:\Program Files (x86)\PropellerIDE\library\library" -L E:\Propeller\lamestation\lamestation-sdk-rc2-0.4.0

2016年1月27日 (水)

Propeller始めました(17) ポータブルゲーム機の実装 2

ちびちびと実装を進めていましたLameStationがほぼ完成しました。

Dscn4784

いい感じに仕上がりました。
写真は試しにLameStation SDKのサンプルゲームを書きこんで動かしている状況です。

Dscn4778

実装は本家のLameStationの構造とはちょっと異なります。
既存のQuickStartボードを拡張する形(Arduinoのシールド形式)で実装しました。

表面実装の2x20ピン(オス)を利用してQuickStartボードを拡張するようにしました。

Dscn4738

この方法は今後も色々と使えそうです。

Dscn4775

基板の下には、ダイソーで買った発泡スチロールのボードを取り付けました。
このボードは加工しやすく、強度もそこそこあるのでケースや車体なんかの利用に
良いです。

実際の動作の様子です。片手にカメラを持って撮影しているため、ゲーム操作は適当です。
遊び方も今一分かりませんでした。


このゲーム機の実装で色々と勉強出来ました。
SDKのライブラリを使って何か作る予定です。

ライブラリにはスプライト表示やマップ表示などが充実しており、ちょっとしたゲームが
簡単に作れそうです。


2016年1月10日 (日)

Propeller始めました(16) ポータブルゲーム機の実装 1

LameStationのサイトの情報を元にポータブルゲーム機を実装することにしました。

Dscn4679

まずは一番のかなめである液晶ディスプレイを実装してみました。
LameStationのサイトの解説では、KS0108 LCDを利用しているとの記載があります。
そこで、手持ちの秋月の「LCDグラフィック・ディスプレイモジュール(液晶表示器)TG12864B-02WWBV」
を試したところ、問題なく表示出来ました。

Dscn4673

この液晶ディスプレイは2色表示のはずですが、PWM的な操作で見た目上の
中間色を再現しています。若干中間色のドットはチラつきが発生します。

若干、液晶の表示速度が遅いようでスプライト表示のデモプログラムを試したところ、
見えにくい状況でした。

液晶モジュールとプロペラ間のデータ通信の結線には15Ωの抵抗が入っています。
ダンピング抵抗というものだそうです。なくても動くようですが、とりあえず回路図に
従って入れました。

次は、ジョイスティックまわりを実装して操作が出来るようにしてみます。