ヒートガン 1800W 強弱2段階切り替え可能 アタッチメント付き
熱収縮チューブ 等に (利用無料)
利用してみたい方、お気軽にご連絡ください。
お問い合わせ
レーザーカッターで簡単にできるフェルトマスコット
おもちゃ病院の仲間が持っていた型紙付きのアンパンマン雑誌を見て、これはレーザーカッターの応用にちょうど良いと思い、早速作ってみました。
型紙をスキャナーで取り込み、ちょっと画像処理して、フェルトの色ごとに画像を分解します。
材料は、\100ショップで手に入れた、粘着タイプの「シールフェルト」です。
90x90の大きさで10色(10枚)入っていました。
レーザーカッターでカットの終わったシールフェルトを、貼り重ねるだけで、簡単に出来上がるので、小さい子供たちにはちょうど良いですね。
ご覧の通りの出来栄えです。(色の選び方は、私のセンスがいまいちですが・・・)
涵養塾のレーザーカッターは、半分自作で、10Wの半導体レーザーを使用しており、レーザー彫刻はもちろん、3mm程度のMDF木材、アクリル板(黒)などの切断まで可能です。
どうぞ、お試しください。
チャレンジしてみたい方、お気軽にご連絡ください。
お問い合わせ
型紙をスキャナーで取り込み、ちょっと画像処理して、フェルトの色ごとに画像を分解します。
材料は、\100ショップで手に入れた、粘着タイプの「シールフェルト」です。
90x90の大きさで10色(10枚)入っていました。
レーザーカッターでカットの終わったシールフェルトを、貼り重ねるだけで、簡単に出来上がるので、小さい子供たちにはちょうど良いですね。
ご覧の通りの出来栄えです。(色の選び方は、私のセンスがいまいちですが・・・)
涵養塾のレーザーカッターは、半分自作で、10Wの半導体レーザーを使用しており、レーザー彫刻はもちろん、3mm程度のMDF木材、アクリル板(黒)などの切断まで可能です。
どうぞ、お試しください。
チャレンジしてみたい方、お気軽にご連絡ください。
お問い合わせ
HackBerry 電動義手 電子部品、金属部品キット
HackBerry 電動義手 電子部品、金属部品キット
HackBerry で使う電子部品と金属部品をキットにしました。
プリント基板は右手用(白)と左手用(茶色)があります。 どちらかをご指定下さい。
部品表は下記「涵養塾在庫表」の「HACKキット部品表」をご覧ください。https://docs.google.com/spreadsheets/d/1QE58LmNZpJyXpU6QLwH1ASy_kHTpAW_pjGs5_zJI8yI/pubhtml?gid=50258853&single=true
バッテリーとセンサーは含まれていません。別途ご用意ください。
価格 ¥9,500円(税込み 送料別) オンラインショップ
別売り標準センサーボードはこちら ¥1000円(税込み 送料別) オンラインショップ
お願い:
最近、サーボモータのES08MDの入手が難しく、代わりに、ES08MDII、または、ES08MAII を同梱する場合があります。 この場合は回転方向が逆になりますので、プログラムで回転方向を正しく設定してください。
チャレンジしてみたい方、お気軽にご連絡ください。
お問い合わせ
参考情報:
こ部品キットでは、マイクロコントローラを価格の面からArduino-Microではなく、格安のArduino-NANO互換品にしています。
このため、マイクロコントローラチップと、USB-Serial変換チップが違います。
まず、マイクロコントローラチップの違いから、1か所だけIOピンのコンフィギュレーションの変更が必要です。
V1の右手用ソースコードでは、
const int calibPin0 = A6:
この行を
const int calibPin0 = 4:
に変更します。
(左手用ソースコードの変更はありませんが、キャリブレーションのスイッチ動作が右手用途は違うようですのでご注意。)
最新のソースコードでは確認していませんので、Arduino-MicroとArduino-NANOのピン番号を比較して、適切に変更してください。
また、USB-Serial変換チップにはCH340が使われています。
Windows10では自動でドライバーがインストールされていますが、Windows7で自動でドライバーがインストールされないようです。
別途ドライバーをインストールする必要があります。
下記のブログが参考になりました。
CH340 USBシリアル変換ドライバ | ネクストステップ サポートBlog
実際に利用したドライバーのリンクは下記のとおりです。
CH341SER.ZIP
または、
CH341SER.EXE
ご参考まで。
HackBerry で使う電子部品と金属部品をキットにしました。
プリント基板は右手用(白)と左手用(茶色)があります。 どちらかをご指定下さい。
部品表は下記「涵養塾在庫表」の「HACKキット部品表」をご覧ください。https://docs.google.com/spreadsheets/d/1QE58LmNZpJyXpU6QLwH1ASy_kHTpAW_pjGs5_zJI8yI/pubhtml?gid=50258853&single=true
バッテリーとセンサーは含まれていません。別途ご用意ください。
価格 ¥9,500円(税込み 送料別) オンラインショップ
別売り標準センサーボードはこちら ¥1000円(税込み 送料別) オンラインショップ
お願い:
最近、サーボモータのES08MDの入手が難しく、代わりに、ES08MDII、または、ES08MAII を同梱する場合があります。 この場合は回転方向が逆になりますので、プログラムで回転方向を正しく設定してください。
チャレンジしてみたい方、お気軽にご連絡ください。
お問い合わせ
参考情報:
こ部品キットでは、マイクロコントローラを価格の面からArduino-Microではなく、格安のArduino-NANO互換品にしています。
このため、マイクロコントローラチップと、USB-Serial変換チップが違います。
まず、マイクロコントローラチップの違いから、1か所だけIOピンのコンフィギュレーションの変更が必要です。
V1の右手用ソースコードでは、
const int calibPin0 = A6:
この行を
const int calibPin0 = 4:
に変更します。
(左手用ソースコードの変更はありませんが、キャリブレーションのスイッチ動作が右手用途は違うようですのでご注意。)
最新のソースコードでは確認していませんので、Arduino-MicroとArduino-NANOのピン番号を比較して、適切に変更してください。
また、USB-Serial変換チップにはCH340が使われています。
Windows10では自動でドライバーがインストールされていますが、Windows7で自動でドライバーがインストールされないようです。
別途ドライバーをインストールする必要があります。
下記のブログが参考になりました。
CH340 USBシリアル変換ドライバ | ネクストステップ サポートBlog
実際に利用したドライバーのリンクは下記のとおりです。
CH341SER.ZIP
または、
CH341SER.EXE
ご参考まで。
スマートカーキット CHUM ESP-Toy(esp8266) と Scratch Mesh
スクラッチ(ピョンキー)を使ったロボットプログラミングに最適のスマートカーキット 2種
ESP-Toyとセットでロボットプログラムの入門として最適です。
・アクリルベースの大型タイヤモデル
Smart Car Kit-Acryl_Base
ESP-Toyには、WiFi-APモードでScratch(Pyonkee)のMesh(遠隔センサー機能)対応のファームウェアが準備されています。
参考リンク
ITPRO 簡単だけど奥が深い!Scratchプログラミングの魅力
Mesh Scratch wiki
涵養塾のオリジナル商品や、取扱部品の価格や在庫状況は、涵養塾の在庫票をご参照下さい。
チャレンジしてみたい方、お気軽にご連絡ください。
お問い合わせ
ESP-Toyとセットでロボットプログラムの入門として最適です。
・3Dプリンターで作った、LEGO規格サイズのスマートカーキット
Smart Car Kit-LEGO_Forn_Factor・アクリルベースの大型タイヤモデル
Smart Car Kit-Acryl_Base
(超音波センサーはオプション)
ESP-Toyとセットで ¥3,000円(税込み 送料別)
ESP-Toyには、WiFi-APモードでScratch(Pyonkee)のMesh(遠隔センサー機能)対応のファームウェアが準備されています。
参考リンク
ITPRO 簡単だけど奥が深い!Scratchプログラミングの魅力
Mesh Scratch wiki
涵養塾のオリジナル商品や、取扱部品の価格や在庫状況は、涵養塾の在庫票をご参照下さい。
チャレンジしてみたい方、お気軽にご連絡ください。
お問い合わせ
スクラッチでも動かせるIoTおもちゃコントローラ "ESP-Toy"
スクラッチでも動かせるIoTおもちゃコントローラ "ESP-Toy" はESP-WROOM02 WiFiモジュールをベースにカラーLEDとモータードライバーを搭載した汎用コントローラモジュールです
おもちゃを意識して、色もカラフルに5色そろえました。
用途
製作例
ESP-Toy_kit Green
ESP-Toy_kit Red
ESP-Toy_kit Yellow
ESP-Toy_kit Blue
ESP-Toy_kit Black
価格 ¥1,500.-(税込み 送料別)オンラインショップ
(組み立て済みは¥2,500.-)オンラインショップ
涵養塾のオリジナル商品や、取扱部品の価格や在庫状況は、涵養塾の在庫票をご参照下さい。
電子工作キット ESP-Toy_kit は 「涵養塾オリジナル」の「電子工作キット」
Appendix1.ESP-WROOM-02 参考URL ここを一番参考にしました
http://qiita.com/tags/ESP-WROOM-02
チャレンジしてみたい方、お気軽にご連絡ください。
お問い合わせ
Appendix2. ESP-Toy Schematics
おもちゃを意識して、色もカラフルに5色そろえました。
用途
- ArduinoIDEで簡単に開発できるIoTモジュール
- 各種センサーを使ったリモートセンシング
- スクラッチのプログラム勉強用フィジカルブロック
- あなたのおもちゃをワイヤレスコントロールおもちゃに改造
- LEGOブロックとの組み合わせでお安いロボット
- スクラッチですぐに使えるWi-Fi AP 機能付きのファームもあります
- フルカラーLED(基板には1個、外付け(オプション)すれば)何個でも使える
- モーターを2個まで動かせる
- サーボモーターを同時に3個まで動かせる(オプション)
- いろんなセンサーを付けることができる(I2Cオプション)
- WiFiのアクセスポイントにもなる
- スクラッチ(PYONKEE)からWiFi(無線で)コントロールできる
- Arduino-IDEでプログラムできる
- LUAやMicroPythonを使うこともできる(ファームの書き換えによる)
製作例
ESP-Toy_kit Green
ESP-Toy_kit Red
ESP-Toy_kit Yellow
ESP-Toy_kit Blue
ESP-Toy_kit Black
価格 ¥1,500.-(税込み 送料別)オンラインショップ
(組み立て済みは¥2,500.-)オンラインショップ
涵養塾のオリジナル商品や、取扱部品の価格や在庫状況は、涵養塾の在庫票をご参照下さい。
電子工作キット ESP-Toy_kit は 「涵養塾オリジナル」の「電子工作キット」
Appendix1.ESP-WROOM-02 参考URL ここを一番参考にしました
http://qiita.com/tags/ESP-WROOM-02
チャレンジしてみたい方、お気軽にご連絡ください。
お問い合わせ
Appendix2. ESP-Toy Schematics
2.4" 240x320 color LCD と Arduino nano で、小さなターミナルを自作してみました。
2.4" 240x320 color LCD と Arduino nano で、小さなターミナルを自作してみました。
写真中央のArduino-NANOをコントローラとして、手前の黒いコネクタはマイコン用のUART、左上は電源コネクタ、右上はキーボード用のPS2コネクタ、その他はArguino互換のピン配置で、LCDモジュール用のコネクタだ。
実験なので、Arduino互換ピン配置のユニバーサルボードを使って、ラッピングで配線をした。
液晶モジュールを載せたところ。
キーボードと電源をつないで、ハイこの通り。
画面の向き、文字の大きさ・色、UARTの通信速度等が設定できるように作ってみた。
チャレンジしてみたい方、お気軽にご連絡ください。
お問い合わせ
参考までに、Arduino-NANOのCodeです。
是非、コメントをお寄せください。
/* By T.Kasahara May-26 '17 CHUM_Terminal Ver1.0
*PS2Keyboard Japanese Keyboard Layout
Color TFTLCD Adafruit library
PS2 Key board
Charactor Terminal
F1 :Help
F5 :Save Setting
F6 :Local Echo
F7 :Board Rate
F8 :Reverse Color
F9 :Back color
F10:Font color
F11:Rotation
F12:Font Size
-ESC- for Exit from Settings
*/
//#define DEBUG //Debug mode
#ifdef DEBUG
#define DEBUG_PRINTLN(x) Serial.println (x)
#define DEBUG_PRINT(x) Serial.print (x)
#define DEBUG_FPRINT(x,y) Serial.print (x,y)
#else
#define DEBUG_PRINTLN(x)
#define DEBUG_PRINT(x)
#define DEBUG_FPRINT(x,y)
#endif
#include // Core graphics library
#include // Hardware-specific library
#include
#define YP A1 // must be an analog pin, use "An" notation!
#define XM A2 // must be an analog pin, use "An" notation!
#define YM 7 // can be a digital pin
#define XP 6 // can be a digital pin
#define TS_MINX 150
#define TS_MINY 120
#define TS_MAXX 920
#define TS_MAXY 940
// For better pressure precision, we need to know the resistance
// between X+ and X- Use any multimeter to read it
// For the one we're using, its 300 ohms across the X plate
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);
#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
CHUM_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD);
#define T_Wrap HIGH //Text Wrap around ON:HIGH,OFF:LOW
#define blink_speed 1000
#define D_Width 240 //Display Width size Pixel
#define D_Hight 320 //Display Hight size Pixel
#define Wait_setup 2000
// Assign human-readable names to some common 16-bit color values:
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
#include
#define EE_boardrate 1023
#define EE_F_color 1022
#define EE_B_color 1021
#define EE_rotation 1020
#define EE_C_Size 1019
#define EE_Echo 1018
#include //code modified for Japanese Key board
const int DataPin = 18;
const int IRQpin = 2;
PS2Keyboard keyboard;
int color[]={BLACK,BLUE,RED,GREEN,CYAN,MAGENTA,YELLOW,WHITE};
int C_Size = 2; //Charactor Mag.
#define C_Max 4
long rate[]={9600,19200,38400,57600,74880,115200,230400,250000};
int boardrate = 0;
int rotation = 0; //Display rotation 0&2:H,1&3:V
int F_color = 0;
int B_color = 0;
int echo = 0;
int End_Line ;
int C_Line = 0;
boolean toggle = 0;
int ii,jj;
char cc;
uint8_t c;
int count;
unsigned long c_time;
void setup() {
// Restore settings
boardrate = EEPROM.read(EE_boardrate);
F_color = EEPROM.read(EE_F_color);
B_color = EEPROM.read(EE_B_color);
rotation = EEPROM.read(EE_rotation);
C_Size = EEPROM.read(EE_C_Size);
if(C_Size == 0) C_Size = 1;
echo = EEPROM.read(EE_Echo);
//Keyboard Serial Begin
keyboard.begin(DataPin, IRQpin, PS2Keymap_Japanese);
Serial.begin(rate[boardrate]);
DEBUG_PRINTLN(F("CHUM_Terminal V0.1"));
// TFTLCD Initialize
tft.reset();
uint16_t identifier = tft.readID();
tft.begin(identifier);
refresh(); //Refresh display
tft.print(F("F1 for Setting"));
refresh(); //Refresh display
tft.print(F("F1 for Setting"));
// Setting
if (keyboard.available()) {
c = cc = keyboard.read();
DEBUG_FPRINT(c,HEX);
DEBUG_PRINT(" ");
if(c == 0xc2){
while(c != 0x1B) { // Wait ESC
switch(c){
case 0x81: // F1 Help
tft.fillScreen(color[B_color]); // Screen clear
tft.setTextWrap(T_Wrap); //Set Text Wrap around
tft.setCursor(0,0);
DEBUG_PRINTLN(F("F1 :Help"));
tft.println(F("F1 :Help"));
tft.println(F("F5 :Save EEPROM"));
tft.println(F("F6 :Local Echo"));
tft.println(F("F7 :Board Rate"));
tft.println(F("F8 :Reverse Color"));
tft.println(F("F9 :Back color"));
tft.println(F("F10:Font color"));
tft.println(F("F11:Rotation"));
tft.println(F("F12:Font Size"));
tft.println();
tft.println(F("-ESC- for Exit from Help"));
break;
case 0x85: // F5 Save Settings to EEPROM
F5_Set_EEPROM();
break;
case 0x86: // F6 Local Echo On/Off
F6_sw_echo();
break;
case 0x87: // F7 BoardRte
F7_BoardRate();
break;
case 0x88: // F8 Reverse color
jj = B_color;
B_color = F_color;
F_color = jj;
refresh();
break;
case 0x89: // F9 Back ground color KCMYGBR
B_color += 1;
if( B_color >7) B_color =0;
refresh();
break;
case 0x8A: // F10 Font Color WRGBMYC
F_color -= 1;
if( F_color < 0) F_color =7;
refresh();
break;
case 0x8B: // F11 Rotation 0,1,2,3
rotation +=1;
if(rotation > 3) rotation=0;
refresh();
break;
case 0x8C: // F12 Zoom 1,2,3,4
C_Size +=1;
if(C_Size > C_Max) C_Size=1;
refresh();
break;
default:
;
break;
}
while (!keyboard.available()) ;
cc = keyboard.read();
c = cc;
DEBUG_FPRINT(c,HEX);
DEBUG_PRINT(" ");
}
refresh();
}
}
refresh();
c_time = millis();
}
//************************************************//
void loop() {
C_Line = tft.getCursorY();
// Keyboard
if (keyboard.available()) {
off_Cursor();
c = cc = keyboard.read();
DEBUG_FPRINT(c,HEX);
DEBUG_PRINT(" ");
switch(c){
case 0x0d: //CR
if ( echo != 0) New_Line();
Serial.println();
break;
case 0x0a: //LF
if ( echo != 0) New_Line();
Serial.println();
break;
case 0x08: //Back Space or Left arrow
if ( echo != 0) Back_Space(1);
Serial.print(cc);
break;
case 0x7F: //Delete
if ( echo != 0) Delete_Space();
Serial.print(cc);
break;
case 0x8d: // Up
Serial.write(0x1b);Serial.write(0x5b);
Serial.write(0x41);
break;
case 0x8e: // Down
Serial.write(0x1b);Serial.write(0x5b);
Serial.write(0x42);
break;
case 0x8f: // Right
Serial.write(0x1b);Serial.write(0x5b);
Serial.write(0x43);
break;
case 0x90: // Left
Serial.write(0x1b);Serial.write(0x5b);
Serial.write(0x44);
break;
default:
if ( echo != 0){
tft.print(cc);
New_Line();
}
Serial.write(c);
break;
}
}
//Serial
if(Serial.available()){
off_Cursor();
c = cc = Serial.read();
switch(c){
case 0x0d: //CR
tft.setCursor( 0, tft.getCursorY());
// New_Line();
break;
case 0x0a: //LF
tft.println();
New_Line();
break;
case 0x08: //Back Space
Back_Space(1);
break;
case 0x7F: //Delete
Delete_Space();
break;
case 0x1b: //ESC Sequence
while(!Serial.available());
c = cc = Serial.read();
if(c != 0x5b ) break;
count = 0;
do{
while(!Serial.available());
c = cc = Serial.read();
if( c == 0x4b ){ //delete line
Clear_line(tft.getCursorX(),tft.getCursorY());
break;
}else if(c == 0x44){ //Number
if(count == 0) count = 1;
Back_Space(count);
break;
}else if( (c >= 0x30) && (c <= 0x39)){ //Number
count = count*10 + (c -0x30);
}else {
break;
}
}while(1);
break;
default:
tft.print(cc);
New_Line();
break;
}
}
if ( (millis()-c_time) > blink_speed ){
if(toggle){
tft.setTextColor(color[F_color]);
tft.print("_");
}else{
tft.setTextColor(color[B_color]);
tft.print("_");
}
Back_Space(1);
tft.setTextColor(color[F_color],color[B_color]);
toggle = !toggle;
c_time = millis();
}
}
void off_Cursor(){
tft.setTextColor(color[B_color]);
tft.print("_");
Back_Space(1);
tft.setTextColor(color[F_color],color[B_color]);
}
void Delete_Space(){
tft.print(" ");
jj = tft.getCursorX() - 12 * C_Size;
if( jj < 0) jj=0;
tft.setCursor( jj, tft.getCursorY());
}
void Back_Space(int pp){
jj = tft.getCursorX() - 6 * C_Size * pp;
if( jj < 0) jj=0;
tft.setCursor( jj, tft.getCursorY());
}
void New_Line(){
jj = tft.getCursorY();
if( C_Line < jj ){
if(jj >= End_Line){
tft.setCursor(0, 0);
jj = 0;
}
// DEBUG_PRINT(" Y=");
// DEBUG_PRINTLN(jj);
C_Line = jj;
Clear_line(tft.getCursorX(),jj);
}
}
void Clear_line(int xx, int yy){
tft.setTextWrap(LOW);
tft.print(F(" "));
tft.setCursor(xx,yy);
tft.setTextWrap(T_Wrap);
}
void F6_sw_echo(){
tft.fillScreen(color[B_color]); // Screen clear
tft.setCursor(0,0);
DEBUG_PRINTLN(F("F6 :Local Echo ON/Off"));
if( echo == 0) {
tft.println(F("Local Echo OFF"));
}else{
tft.println(F("Local Echo ON "));
}
tft.println();
tft.println(F("ESC->Exit"));
while(c != 0x1B) { // Wait ESC
while(!keyboard.available()) ; // wait key
c = keyboard.read();
tft.setCursor(0,0);
tft.println();
if(keyboard.available()) c = keyboard.read();
if(c != 0x1B) echo ^= 0x0001 ;
if( echo == 0) {
tft.println(F("Local Echo OFF"));
}else{
tft.println(F("Local Echo ON "));
}
}
refresh();
}
void F7_BoardRate(){
tft.fillScreen(color[B_color]); // Screen clear
tft.setCursor(0,0);
DEBUG_PRINTLN(F("F2 :BoardRate"));
Serial.end();
tft.println(" ");
tft.println("bps");
tft.println();
tft.println(F("ESC->Exit"));
while(c != 0x1B) { // Wait ESC
tft.setCursor(0,0);
tft.print(rate[boardrate]);
tft.println(" ");
while(!keyboard.available()) ; // wait key
c = keyboard.read();
if(keyboard.available()) c = keyboard.read();
if(c != 0x1B) boardrate += 1;
if(boardrate > 7) boardrate = 0;
}
Serial.begin(rate[boardrate]);
refresh();
}
void F5_Set_EEPROM(){
EEPROM.write(EE_boardrate,boardrate);
EEPROM.write(EE_F_color,F_color);
EEPROM.write(EE_B_color,B_color);
EEPROM.write(EE_rotation,rotation);
EEPROM.write(EE_C_Size,C_Size);
refresh();
}
void F1_Help(){
tft.fillScreen(color[B_color]); // Screen clear
tft.setTextWrap(T_Wrap); //Set Text Wrap around
tft.setCursor(0,0);
DEBUG_PRINTLN(F("F1 :Help"));
tft.println(F("F1 :Help"));
tft.println(F("F5 :Save EEPROM"));
tft.println(F("F7 :Board Rate"));
tft.println(F("F8 :Reverse Color"));
tft.println(F("F9 :Back color"));
tft.println(F("F10:Font color"));
tft.println(F("F11:Rotation"));
tft.println(F("F12:Font Size"));
tft.println();
tft.println(F("-ESC- for Exit from Help"));
while(c != 0x1B) { // Wait ESC
c = keyboard.read();
delay(200);
}
refresh();
}
void refresh(){
tft.fillScreen(color[B_color]); // Screen clear
tft.setTextWrap(T_Wrap); //Set Text Wrap around
tft.setRotation(rotation);
tft.setCursor(0,0);
tft.setTextColor(color[F_color],color[B_color]); tft.setTextSize(C_Size);
tft.println(F("CHUM_Terminal V0.1"));
if(rotation == 0 || rotation == 2 ){
End_Line = D_Hight;
}else{
End_Line = D_Width;
}
}
写真中央のArduino-NANOをコントローラとして、手前の黒いコネクタはマイコン用のUART、左上は電源コネクタ、右上はキーボード用のPS2コネクタ、その他はArguino互換のピン配置で、LCDモジュール用のコネクタだ。
実験なので、Arduino互換ピン配置のユニバーサルボードを使って、ラッピングで配線をした。
液晶モジュールを載せたところ。
キーボードと電源をつないで、ハイこの通り。
画面の向き、文字の大きさ・色、UARTの通信速度等が設定できるように作ってみた。
チャレンジしてみたい方、お気軽にご連絡ください。
お問い合わせ
参考までに、Arduino-NANOのCodeです。
是非、コメントをお寄せください。
/* By T.Kasahara May-26 '17 CHUM_Terminal Ver1.0
*PS2Keyboard Japanese Keyboard Layout
Color TFTLCD Adafruit library
PS2 Key board
Charactor Terminal
F1 :Help
F5 :Save Setting
F6 :Local Echo
F7 :Board Rate
F8 :Reverse Color
F9 :Back color
F10:Font color
F11:Rotation
F12:Font Size
-ESC- for Exit from Settings
*/
//#define DEBUG //Debug mode
#ifdef DEBUG
#define DEBUG_PRINTLN(x) Serial.println (x)
#define DEBUG_PRINT(x) Serial.print (x)
#define DEBUG_FPRINT(x,y) Serial.print (x,y)
#else
#define DEBUG_PRINTLN(x)
#define DEBUG_PRINT(x)
#define DEBUG_FPRINT(x,y)
#endif
#include
#include
#include
#define YP A1 // must be an analog pin, use "An" notation!
#define XM A2 // must be an analog pin, use "An" notation!
#define YM 7 // can be a digital pin
#define XP 6 // can be a digital pin
#define TS_MINX 150
#define TS_MINY 120
#define TS_MAXX 920
#define TS_MAXY 940
// For better pressure precision, we need to know the resistance
// between X+ and X- Use any multimeter to read it
// For the one we're using, its 300 ohms across the X plate
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);
#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
CHUM_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD);
#define T_Wrap HIGH //Text Wrap around ON:HIGH,OFF:LOW
#define blink_speed 1000
#define D_Width 240 //Display Width size Pixel
#define D_Hight 320 //Display Hight size Pixel
#define Wait_setup 2000
// Assign human-readable names to some common 16-bit color values:
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
#include
#define EE_boardrate 1023
#define EE_F_color 1022
#define EE_B_color 1021
#define EE_rotation 1020
#define EE_C_Size 1019
#define EE_Echo 1018
#include
const int DataPin = 18;
const int IRQpin = 2;
PS2Keyboard keyboard;
int color[]={BLACK,BLUE,RED,GREEN,CYAN,MAGENTA,YELLOW,WHITE};
int C_Size = 2; //Charactor Mag.
#define C_Max 4
long rate[]={9600,19200,38400,57600,74880,115200,230400,250000};
int boardrate = 0;
int rotation = 0; //Display rotation 0&2:H,1&3:V
int F_color = 0;
int B_color = 0;
int echo = 0;
int End_Line ;
int C_Line = 0;
boolean toggle = 0;
int ii,jj;
char cc;
uint8_t c;
int count;
unsigned long c_time;
void setup() {
// Restore settings
boardrate = EEPROM.read(EE_boardrate);
F_color = EEPROM.read(EE_F_color);
B_color = EEPROM.read(EE_B_color);
rotation = EEPROM.read(EE_rotation);
C_Size = EEPROM.read(EE_C_Size);
if(C_Size == 0) C_Size = 1;
echo = EEPROM.read(EE_Echo);
//Keyboard Serial Begin
keyboard.begin(DataPin, IRQpin, PS2Keymap_Japanese);
Serial.begin(rate[boardrate]);
DEBUG_PRINTLN(F("CHUM_Terminal V0.1"));
// TFTLCD Initialize
tft.reset();
uint16_t identifier = tft.readID();
tft.begin(identifier);
refresh(); //Refresh display
tft.print(F("F1 for Setting"));
refresh(); //Refresh display
tft.print(F("F1 for Setting"));
// Setting
if (keyboard.available()) {
c = cc = keyboard.read();
DEBUG_FPRINT(c,HEX);
DEBUG_PRINT(" ");
if(c == 0xc2){
while(c != 0x1B) { // Wait ESC
switch(c){
case 0x81: // F1 Help
tft.fillScreen(color[B_color]); // Screen clear
tft.setTextWrap(T_Wrap); //Set Text Wrap around
tft.setCursor(0,0);
DEBUG_PRINTLN(F("F1 :Help"));
tft.println(F("F1 :Help"));
tft.println(F("F5 :Save EEPROM"));
tft.println(F("F6 :Local Echo"));
tft.println(F("F7 :Board Rate"));
tft.println(F("F8 :Reverse Color"));
tft.println(F("F9 :Back color"));
tft.println(F("F10:Font color"));
tft.println(F("F11:Rotation"));
tft.println(F("F12:Font Size"));
tft.println();
tft.println(F("-ESC- for Exit from Help"));
break;
case 0x85: // F5 Save Settings to EEPROM
F5_Set_EEPROM();
break;
case 0x86: // F6 Local Echo On/Off
F6_sw_echo();
break;
case 0x87: // F7 BoardRte
F7_BoardRate();
break;
case 0x88: // F8 Reverse color
jj = B_color;
B_color = F_color;
F_color = jj;
refresh();
break;
case 0x89: // F9 Back ground color KCMYGBR
B_color += 1;
if( B_color >7) B_color =0;
refresh();
break;
case 0x8A: // F10 Font Color WRGBMYC
F_color -= 1;
if( F_color < 0) F_color =7;
refresh();
break;
case 0x8B: // F11 Rotation 0,1,2,3
rotation +=1;
if(rotation > 3) rotation=0;
refresh();
break;
case 0x8C: // F12 Zoom 1,2,3,4
C_Size +=1;
if(C_Size > C_Max) C_Size=1;
refresh();
break;
default:
;
break;
}
while (!keyboard.available()) ;
cc = keyboard.read();
c = cc;
DEBUG_FPRINT(c,HEX);
DEBUG_PRINT(" ");
}
refresh();
}
}
refresh();
c_time = millis();
}
//************************************************//
void loop() {
C_Line = tft.getCursorY();
// Keyboard
if (keyboard.available()) {
off_Cursor();
c = cc = keyboard.read();
DEBUG_FPRINT(c,HEX);
DEBUG_PRINT(" ");
switch(c){
case 0x0d: //CR
if ( echo != 0) New_Line();
Serial.println();
break;
case 0x0a: //LF
if ( echo != 0) New_Line();
Serial.println();
break;
case 0x08: //Back Space or Left arrow
if ( echo != 0) Back_Space(1);
Serial.print(cc);
break;
case 0x7F: //Delete
if ( echo != 0) Delete_Space();
Serial.print(cc);
break;
case 0x8d: // Up
Serial.write(0x1b);Serial.write(0x5b);
Serial.write(0x41);
break;
case 0x8e: // Down
Serial.write(0x1b);Serial.write(0x5b);
Serial.write(0x42);
break;
case 0x8f: // Right
Serial.write(0x1b);Serial.write(0x5b);
Serial.write(0x43);
break;
case 0x90: // Left
Serial.write(0x1b);Serial.write(0x5b);
Serial.write(0x44);
break;
default:
if ( echo != 0){
tft.print(cc);
New_Line();
}
Serial.write(c);
break;
}
}
//Serial
if(Serial.available()){
off_Cursor();
c = cc = Serial.read();
switch(c){
case 0x0d: //CR
tft.setCursor( 0, tft.getCursorY());
// New_Line();
break;
case 0x0a: //LF
tft.println();
New_Line();
break;
case 0x08: //Back Space
Back_Space(1);
break;
case 0x7F: //Delete
Delete_Space();
break;
case 0x1b: //ESC Sequence
while(!Serial.available());
c = cc = Serial.read();
if(c != 0x5b ) break;
count = 0;
do{
while(!Serial.available());
c = cc = Serial.read();
if( c == 0x4b ){ //delete line
Clear_line(tft.getCursorX(),tft.getCursorY());
break;
}else if(c == 0x44){ //Number
if(count == 0) count = 1;
Back_Space(count);
break;
}else if( (c >= 0x30) && (c <= 0x39)){ //Number
count = count*10 + (c -0x30);
}else {
break;
}
}while(1);
break;
default:
tft.print(cc);
New_Line();
break;
}
}
if ( (millis()-c_time) > blink_speed ){
if(toggle){
tft.setTextColor(color[F_color]);
tft.print("_");
}else{
tft.setTextColor(color[B_color]);
tft.print("_");
}
Back_Space(1);
tft.setTextColor(color[F_color],color[B_color]);
toggle = !toggle;
c_time = millis();
}
}
void off_Cursor(){
tft.setTextColor(color[B_color]);
tft.print("_");
Back_Space(1);
tft.setTextColor(color[F_color],color[B_color]);
}
void Delete_Space(){
tft.print(" ");
jj = tft.getCursorX() - 12 * C_Size;
if( jj < 0) jj=0;
tft.setCursor( jj, tft.getCursorY());
}
void Back_Space(int pp){
jj = tft.getCursorX() - 6 * C_Size * pp;
if( jj < 0) jj=0;
tft.setCursor( jj, tft.getCursorY());
}
void New_Line(){
jj = tft.getCursorY();
if( C_Line < jj ){
if(jj >= End_Line){
tft.setCursor(0, 0);
jj = 0;
}
// DEBUG_PRINT(" Y=");
// DEBUG_PRINTLN(jj);
C_Line = jj;
Clear_line(tft.getCursorX(),jj);
}
}
void Clear_line(int xx, int yy){
tft.setTextWrap(LOW);
tft.print(F(" "));
tft.setCursor(xx,yy);
tft.setTextWrap(T_Wrap);
}
void F6_sw_echo(){
tft.fillScreen(color[B_color]); // Screen clear
tft.setCursor(0,0);
DEBUG_PRINTLN(F("F6 :Local Echo ON/Off"));
if( echo == 0) {
tft.println(F("Local Echo OFF"));
}else{
tft.println(F("Local Echo ON "));
}
tft.println();
tft.println(F("ESC->Exit"));
while(c != 0x1B) { // Wait ESC
while(!keyboard.available()) ; // wait key
c = keyboard.read();
tft.setCursor(0,0);
tft.println();
if(keyboard.available()) c = keyboard.read();
if(c != 0x1B) echo ^= 0x0001 ;
if( echo == 0) {
tft.println(F("Local Echo OFF"));
}else{
tft.println(F("Local Echo ON "));
}
}
refresh();
}
void F7_BoardRate(){
tft.fillScreen(color[B_color]); // Screen clear
tft.setCursor(0,0);
DEBUG_PRINTLN(F("F2 :BoardRate"));
Serial.end();
tft.println(" ");
tft.println("bps");
tft.println();
tft.println(F("ESC->Exit"));
while(c != 0x1B) { // Wait ESC
tft.setCursor(0,0);
tft.print(rate[boardrate]);
tft.println(" ");
while(!keyboard.available()) ; // wait key
c = keyboard.read();
if(keyboard.available()) c = keyboard.read();
if(c != 0x1B) boardrate += 1;
if(boardrate > 7) boardrate = 0;
}
Serial.begin(rate[boardrate]);
refresh();
}
void F5_Set_EEPROM(){
EEPROM.write(EE_boardrate,boardrate);
EEPROM.write(EE_F_color,F_color);
EEPROM.write(EE_B_color,B_color);
EEPROM.write(EE_rotation,rotation);
EEPROM.write(EE_C_Size,C_Size);
refresh();
}
void F1_Help(){
tft.fillScreen(color[B_color]); // Screen clear
tft.setTextWrap(T_Wrap); //Set Text Wrap around
tft.setCursor(0,0);
DEBUG_PRINTLN(F("F1 :Help"));
tft.println(F("F1 :Help"));
tft.println(F("F5 :Save EEPROM"));
tft.println(F("F7 :Board Rate"));
tft.println(F("F8 :Reverse Color"));
tft.println(F("F9 :Back color"));
tft.println(F("F10:Font color"));
tft.println(F("F11:Rotation"));
tft.println(F("F12:Font Size"));
tft.println();
tft.println(F("-ESC- for Exit from Help"));
while(c != 0x1B) { // Wait ESC
c = keyboard.read();
delay(200);
}
refresh();
}
void refresh(){
tft.fillScreen(color[B_color]); // Screen clear
tft.setTextWrap(T_Wrap); //Set Text Wrap around
tft.setRotation(rotation);
tft.setCursor(0,0);
tft.setTextColor(color[F_color],color[B_color]); tft.setTextSize(C_Size);
tft.println(F("CHUM_Terminal V0.1"));
if(rotation == 0 || rotation == 2 ){
End_Line = D_Hight;
}else{
End_Line = D_Width;
}
}
Micro Python & 自作ターミナル
手持ちの ”Cortex-M4"マイクロコントローラボード "NUCLEO-F401RE" の使い道を考えていたところ、"MicroPython" を見つけたので、試してみた。
CQ出版の インターフェース2016年10月号(PDFで購入)で"Python" の特集があり、そこに、詳しい説明(第7章アプリはスクリプトで柔軟に!マイコン用MicroPythonプログラミング)があったので参考にした。
左のLCDは、320x240の自作ターミナルです。
映像は、ターミナルをリセットしたのち、NUCLEO-F401REをリセットするとMicroPythonが起動し、キーボードから”1+2”と入力すると、答えが表示されている様子がわかります。
"MicroPython"には、esp8266、esp32用のコードも用意されていますので、ターミナルさえ準備できれば、手軽に学習ができると思い、このターミナルを作ってみました。
てがるに、Pythonを勉強するには、持ってこいではないですか?
チャレンジしてみたい方、お気軽にご連絡ください。
お問い合わせ
CQ出版の インターフェース2016年10月号(PDFで購入)で"Python" の特集があり、そこに、詳しい説明(第7章アプリはスクリプトで柔軟に!マイコン用MicroPythonプログラミング)があったので参考にした。
映像は、ターミナルをリセットしたのち、NUCLEO-F401REをリセットするとMicroPythonが起動し、キーボードから”1+2”と入力すると、答えが表示されている様子がわかります。
"MicroPython"には、esp8266、esp32用のコードも用意されていますので、ターミナルさえ準備できれば、手軽に学習ができると思い、このターミナルを作ってみました。
てがるに、Pythonを勉強するには、持ってこいではないですか?
チャレンジしてみたい方、お気軽にご連絡ください。
お問い合わせ
REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER をつなぐ
REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER をつないで、SDCardから、オフラインでプリントできるようになりました。
Ben_Kとの接続のためには、コネクタのアダプターを別途作成する必要があります。
それ用に、ピンを開けておいたので、割と簡単にできると思います。
以下のpins.hを参考に、作ってください。
(ご要望が多ければ、専用のボードを開発しますので、ご連絡ください。)
もちろんファームの変更も必要です。
Marlin Firmware の configuration.h pins.h の2つのファイルを変更します。
**** configuration.h *****
まず、configuration.h は 500行目付近にある
//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER
***** pins.h *****
こちらは、Ben_K のPin Assignments を以下を参考に、変更します。
/****************************************************************
* BEN_K Pin Assignments
******************************************************************/
#if MB(BEN_K)
#define KNOWN_BOARD
#ifndef __AVR_ATmega2560__
#error Oops! Make sure you have 'Ben_K2560' selected from the 'Tools -> Boards' menu.
#endif
#define LARGE_FLASH true
#define X_STEP_PIN 37
#define X_DIR_PIN 49
#define X_ENABLE_PIN 29
#define Y_STEP_PIN 36
#define Y_DIR_PIN 48
#define Y_ENABLE_PIN 28
#define Z_STEP_PIN 32
#define Z_DIR_PIN 47
#define Z_ENABLE_PIN 27
// Brn_K pin#
#define X_MIN_PIN 81
#define X_MAX_PIN -1 //82
#define Y_MIN_PIN 80
#define Y_MAX_PIN -1 //83
#define Z_MIN_PIN 79
#define Z_MAX_PIN -1 //38 Use for Servo
#define HEATER_BED_PIN 45
#define TEMP_BED_PIN 13 // Therm1
#define HEATER_0_PIN 44
#define TEMP_0_PIN 12 // Therm0
#define HEATER_1_PIN -1
#define TEMP_1_PIN 14 // Therm3
#ifdef BARICUDA
#define HEATER_2_PIN -1
#else
#define HEATER_2_PIN -1
#endif
#define TEMP_2_PIN 15 // Therm3
#define E0_STEP_PIN 34
#define E0_DIR_PIN 43
#define E0_ENABLE_PIN 26
#define E1_STEP_PIN 33
#define E1_DIR_PIN 42
#define E1_ENABLE_PIN 25
#define SDPOWER -1
#define SDSS -1
#define LED_PIN 13
#define FAN_PIN 46
#define PS_ON_PIN -1
#define KILL_PIN -1 //80 with Smart Controller LCD
#define SUICIDE_PIN -1 //PIN that has to be turned on right after start, to keep power flowing.
#ifdef NUM_SERVOS
#define SERVO0_PIN 38 // Z_MAX_PIN
#endif
#ifdef ULTRA_LCD
#define KILL_PIN 55
#ifdef NEWPANEL
//arduino pin which triggers an piezzo beeper
#define BEEPER 56 // Beeper on AUX-4
#define LCD_PINS_RS 60
#define LCD_PINS_ENABLE 61
#define LCD_PINS_D4 62
#define LCD_PINS_D5 63
#define LCD_PINS_D6 64
#define LCD_PINS_D7 65
//buttons are directly attached using AUX-2
#define BTN_EN1 57
#define BTN_EN2 58
#define BTN_ENC 59 //the click
#define BLEN_C 2
#define BLEN_B 1
#define BLEN_A 0
#define SDCARDDETECT 54
#define SDSS 53
//encoder rotation values
#define encrot0 0
#define encrot1 2
#define encrot2 3
#define encrot3 1
#else //old style panel with shift register
//arduino pin witch triggers an piezzo beeper
#define BEEPER 33 No Beeper added
//buttons are attached to a shift register
// Not wired this yet
// #define SHIFT_CLK 38
// #define SHIFT_LD 42
// #define SHIFT_OUT 40
// #define SHIFT_EN 17
#define LCD_PINS_RS 75
#define LCD_PINS_ENABLE 17
#define LCD_PINS_D4 23
#define LCD_PINS_D5 25
#define LCD_PINS_D6 27
#define LCD_PINS_D7 29
//encoder rotation values
#define encrot0 0
#define encrot1 2
#define encrot2 3
#define encrot3 1
//bits in the shift register that carry the buttons for:
// left up center down right red
#define BL_LE 7
#define BL_UP 6
#define BL_MI 5
#define BL_DW 4
#define BL_RI 3
#define BL_ST 2
#define BLEN_B 1
#define BLEN_A 0
#endif
#endif //ULTRA_LCD
#ifndef SDSUPPORT
// these pins are defined in the SD library if building with SD support
#define SCK_PIN 52
#define MISO_PIN 50
#define MOSI_PIN 51
#endif
#endif // BEN_K
使ったLCDは、REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER(安いです)
Ben_Kとの接続のためには、コネクタのアダプターを別途作成する必要があります。
それ用に、ピンを開けておいたので、割と簡単にできると思います。
以下のpins.hを参考に、作ってください。
(ご要望が多ければ、専用のボードを開発しますので、ご連絡ください。)
もちろんファームの変更も必要です。
Marlin Firmware の configuration.h pins.h の2つのファイルを変更します。
**** configuration.h *****
まず、configuration.h は 500行目付近にある
//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER
この行の頭の"//"を削除して、有効にします。
(もちろん他のLCDをすでに使っていた場合は、その該当行はコメントにしてください。)
***** pins.h *****
こちらは、Ben_K のPin Assignments を以下を参考に、変更します。
/****************************************************************
* BEN_K Pin Assignments
******************************************************************/
#if MB(BEN_K)
#define KNOWN_BOARD
#ifndef __AVR_ATmega2560__
#error Oops! Make sure you have 'Ben_K2560' selected from the 'Tools -> Boards' menu.
#endif
#define LARGE_FLASH true
#define X_STEP_PIN 37
#define X_DIR_PIN 49
#define X_ENABLE_PIN 29
#define Y_STEP_PIN 36
#define Y_DIR_PIN 48
#define Y_ENABLE_PIN 28
#define Z_STEP_PIN 32
#define Z_DIR_PIN 47
#define Z_ENABLE_PIN 27
// Brn_K pin#
#define X_MIN_PIN 81
#define X_MAX_PIN -1 //82
#define Y_MIN_PIN 80
#define Y_MAX_PIN -1 //83
#define Z_MIN_PIN 79
#define Z_MAX_PIN -1 //38 Use for Servo
#define HEATER_BED_PIN 45
#define TEMP_BED_PIN 13 // Therm1
#define HEATER_0_PIN 44
#define TEMP_0_PIN 12 // Therm0
#define HEATER_1_PIN -1
#define TEMP_1_PIN 14 // Therm3
#ifdef BARICUDA
#define HEATER_2_PIN -1
#else
#define HEATER_2_PIN -1
#endif
#define TEMP_2_PIN 15 // Therm3
#define E0_STEP_PIN 34
#define E0_DIR_PIN 43
#define E0_ENABLE_PIN 26
#define E1_STEP_PIN 33
#define E1_DIR_PIN 42
#define E1_ENABLE_PIN 25
#define SDPOWER -1
#define SDSS -1
#define LED_PIN 13
#define FAN_PIN 46
#define PS_ON_PIN -1
#define KILL_PIN -1 //80 with Smart Controller LCD
#define SUICIDE_PIN -1 //PIN that has to be turned on right after start, to keep power flowing.
#ifdef NUM_SERVOS
#define SERVO0_PIN 38 // Z_MAX_PIN
#endif
#ifdef ULTRA_LCD
#define KILL_PIN 55
#ifdef NEWPANEL
//arduino pin which triggers an piezzo beeper
#define BEEPER 56 // Beeper on AUX-4
#define LCD_PINS_RS 60
#define LCD_PINS_ENABLE 61
#define LCD_PINS_D4 62
#define LCD_PINS_D5 63
#define LCD_PINS_D6 64
#define LCD_PINS_D7 65
//buttons are directly attached using AUX-2
#define BTN_EN1 57
#define BTN_EN2 58
#define BTN_ENC 59 //the click
#define BLEN_C 2
#define BLEN_B 1
#define BLEN_A 0
#define SDCARDDETECT 54
#define SDSS 53
//encoder rotation values
#define encrot0 0
#define encrot1 2
#define encrot2 3
#define encrot3 1
#else //old style panel with shift register
//arduino pin witch triggers an piezzo beeper
#define BEEPER 33 No Beeper added
//buttons are attached to a shift register
// Not wired this yet
// #define SHIFT_CLK 38
// #define SHIFT_LD 42
// #define SHIFT_OUT 40
// #define SHIFT_EN 17
#define LCD_PINS_RS 75
#define LCD_PINS_ENABLE 17
#define LCD_PINS_D4 23
#define LCD_PINS_D5 25
#define LCD_PINS_D6 27
#define LCD_PINS_D7 29
//encoder rotation values
#define encrot0 0
#define encrot1 2
#define encrot2 3
#define encrot3 1
//bits in the shift register that carry the buttons for:
// left up center down right red
#define BL_LE 7
#define BL_UP 6
#define BL_MI 5
#define BL_DW 4
#define BL_RI 3
#define BL_ST 2
#define BLEN_B 1
#define BLEN_A 0
#endif
#endif //ULTRA_LCD
#ifndef SDSUPPORT
// these pins are defined in the SD library if building with SD support
#define SCK_PIN 52
#define MISO_PIN 50
#define MOSI_PIN 51
#endif
#endif // BEN_K
**************************
以上です。
チャレンジしてみたい方、お気軽にご連絡ください。
登録:
投稿 (Atom)