フォト
2025年3月
            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 29
30 31          
無料ブログはココログ

« 2019年2月 | トップページ | 2019年4月 »

2019年3月の12件の記事

2019年3月31日 (日)

プログラムソースの掲載テスト

動作確認テストです。
この記事はすぐに消します。
どうも、HTML直接編集後に通常エディタで編集するとダメっぽい。
以前は問題なかったのに..
今回のココログのシステムリニューアル、かなりレベルの低いエンジニアがシステムを手掛けたに違いない。

<pre></pre>が分断されてしまう。
HTMLエディタ <=> リッチテキストエディタを切り替え利用で
HTMLのタグをちゃんと処理できていないみたい。
切り替えるごとに、レイアウトが崩れる。
<pre>ブロック内に勝手に<br>をタグとしてではなく、見た目として<br>が表示されるように付加される。

現段階では、過去記事を編集するとレイアウトが崩れる可能性ありです。
ココログのリニューアル、みんなを不幸にするリニューアル。
目的は何だったのだろう..

2019/04/20 更新

とりあえず、分断される<pre>ブロック間のつなぎ目が目立たないように加工することで
プログラムソースの掲載は出来ました。
ただし、この作業がかなり面倒くさいです。

また、<pre>タグにCSSを使って背景色等のスタイル指定を今までしていたのですが、
数十にも分断される<pre>タグすべてにつけるのは面倒なので諦めました。

//
// MML演奏サンプル
//
#include "MML.h"
#include "TimerEvent.h"
#include "src/LIB/sound.h"
TimerEvent ticker;   // タイマー割り込み管理
MML mml;             // MML文演奏管理
// バックグラウンド演奏割り込み
void handle_timer() {
  if (mml.isBGMPlay())
    if (mml.available()) 
     mml.playTick();    
}
// 猫ふんじゃった
const char * mmltext =
  "O6t180v15l16d+c+r8f+rf+rd+c+r8f+rf+rd+c+l8rf+r"
  "f+rl16frfrd+c+r8frfrd+c+r8frfrd+c+l8"
  "rfrfrl16f+rf+rd+c+r8f+rf+rd+c+r8f+r"
  "f+rd+c+l8rf+rf+rl16frfrd+c+r8frfrd+c+r8fr"
  "frd+c+l8rfrfrl16f+rf+rd+c+l8rf+rf+rf+r"
  "f+rf+rf+rl16frfrd+c+l8rfrfrfrfrfrfrl16"
  "f+rf+rd+c+r8f+rf+rd+c+r8f+rf+rd+c+l8r"
  "f+rf+rl16frfrd+c+r8frfrd+c+r8frfrd+c+l8"
  "rfrfrl16f+rf+r8.f+rc+c+d8c+8.frf+"
  ;
// デバッグ出力用
void debug(uint8_t c) {
  Serial.write(c);
}
// フォアグランド演奏の停止
void OnStopPkay() {
  if (mml.isPlay()) {
    mml.stop();
    Serial.println("Stop foreground playing");
  }
}
void setup() {
  Serial.begin(115200);
  // フォアグランド演奏停止用ボタンの設定
  pinMode(PB8,INPUT_PULLUP);
  attachInterrupt(PB8, OnStopPkay, FALLING);
 // キーボード入力待ち  while (!Serial.available())    continue;
 // MML初期化、デバイス依存関数の登録  mml.init(dev_toneInit, dev_tone, dev_notone, debug);
  // タイマー割り込み設定
  ticker.set(10, handle_timer);
  ticker.setPriority(14);
  ticker.start();
  // フォアグランド演奏
  Serial.println("Now foreground playing ..");
  mml.setText(mmltext);
  mml.play();
  detachInterrupt(PB8);
  delay(1000);
  // バックグラウンド演奏 
  Serial.println("Now Background playing ..");
  Serial.println("Menu: e:end, r:resume,  s:start"); 
 mml.playBGM(); }
void loop() {
   // バックグラウンド演奏中の操作 
  if (Serial.available()) {
    uint8_t c = Serial.read();
    if (c == 'e' || c== 'E') {        // 演奏停止
      mml.stop();
    } else if (c == 'r' || c== 'R') { // 演奏再開
      mml.resume();
    } else if (c == 's' || c== 'S') { // 最初から演奏
      mml.stop();
      delay(15);
      mml.playBGM();
    }
  }
}

Markdown記述のテスト

こんにちは

こんにちは

MML_Play

Arduino・Arduino STM32 MML文演奏クラスライブラリ(開発中)

ライブラリ名称

MML (ヘッダーファイル MML.h)

主な機能
- 単音MML文の演奏
- フォアグランド演奏(play)
- バックグラウンド演奏支援機能(playBGM、playTick)

インストール

本パッケージをダウンロードし、解凍したフォルダ内の MMLフォルダを
各自のArduino環境のライブラリ配置フォルダ libraries に配置して下さい。
( 環境設定 - スケッチの保存場所 に設定のフォルダ の libraries に配置)

ライブラリリファレンス

本ライブラリはクラスライブラリとして実装しています。

クラス名

MML

ヘッダーファイル

#include "MML.h"

パブリックメンバー関数

コンストラクタ

  • 書式
    MML

  • 引数
    なし

  • 戻り値
    なし

  • 説明
    MML クラスのインスタンスを作成します。
    コンストラクタによるインスタンスの生成では、ハードウェア資源の確保・初期化等は行いません。
    別途 init()メンバー関数を使って初期化を行う必要があります。

  • 記述例
    MML mml;

とりあえず、Markdownは不具合対応が完了したっぽい

続きを読む "Markdown記述のテスト" »

2019年3月30日 (土)

ココログ、システムリプレイスで動作が不安定です

ココログ、3月19日のシステムリプレイス以降、動作不安定です。
不具合もたくさん発生しています。非常に困っています。

ブログ記事を作成していると、挿入した画像が表示されなかったり、
公開した記事が表示されなかったりと、挙動がよろしくない状態です。
下書きで保存したブログが公開できなかったりと、酷い状況です。

過去記事にまともに表示できないものあると思います。

明らかに事前に十分な動作確認を行っていません。
動作確認すれば、わかるような不具合が多数発生しています。
利用者に不具合の洗い出しをさせる作戦なのでしょうね。

2019年3月23日 (土)

MSX CASIO PV-7を改造してメインメモリーを32kバイトに増量

メインRAMが8kバイトしかないMSX CASIO PV-7、さすがにこれでは厳しいので、
改造して32kバイトに増やしてみました。

 Dscn9856

Dscn9853

参考にした情報
 ・(1) MSX Resource Center - CASIO PV-7 to 16Kb RAM
 ・(2) しおんパパのひみつきち - 旧世界の遺産を守れ!「MSX PV-7/PV-16」カシオ(1984/198x)
 ・(3) 클랴의 공중질소고정법 - MSX PV-7 램 업그레이드 분석 (MSX PV-7 RAMのアップグレード分析)
 ・(4) MSX Resource Center - Casio PV-7

  特に、(3)のクルシャさんの情報が大変参考になりました。

(3)のクルシャさんの情報を参考にして、
基板上のuPD4168 8kバイト XRAM(左写真 上IC)を32kバイト をSRAM HM62256(左写真 下のIC)に交換しました。
基板のパターンカット無しでは、16kバイトまで増量出来ます。

Dscn9850 Dscn9849 

32kバイトに増量するには、
足りない信号(アドレスバス、スロット選択等)を引っ張ってきたり、数か所パターンカットをしましたが、
比較的簡単な改造でメモリを増やせました。

下記の、茶色以外の配線は追加した結線です。

Dscn9847

交換したSRAMは、次のような結線を行っています。

Photo


動作確認として、配列でメモリーを多くとって、値を書き込む確認動作のプログラムを動かしてみました。
とりあえず、問題なさそうです。

Prg

これで、やっと普通のMSXになりました。

Dscn9852

64kバイト化もチャレンジしてみたいと思います。

2019年3月21日 (木)

BluePillボードで4桁7セグLEDの制御

先日のArduino STM32用タイマー割り込みライブラリを使って、
BluePillボードを使って、4桁7セグLEDをダイナミック点灯にて制御してみました。

Dscn9818

動いている様子



以前、秋月電子で入手して放置していた 4桁7セグLEDはOSL40562-IG を利用しました。
このOSL40562-IGアノードコモンでVFが3.3Vと高く 少々使いにくです。

  ダイナミック接続4桁高輝度緑色7セグメントLED表示器 アノードコモン アノード共通接続 OSL40562-IG

  01


03

とりあえず、次のような回路で駆動させてみました。

02

BluePillボードの5Vトレラント対応のピンを使って駆動させます。
各LEDに流れる電流は5mA程度にしています。
I = (5[V] - Vf[V] ) / 330[Ω]  = (5 - 3.3) /330 = 0.00515[A] ≒ 5[mA]

各桁セグメントDIG1 ~ DIG4は、LED8個分の40mAが流れます。 
BluePillボードでは20mAまでしか流せないため、PNPトランジスタ 2SA1015を使って
駆動させるようにしました。

スケッチ
//
// 4桁高輝度緑色7セグメントLED表示器(アノードコモン) OSL40562-IG の制御
// 2019/03/17 たま吉さん 
// 利用パーツ
//  BluePillボード
//  4桁7セグメントLED  OSL40562-IG x 1
//  桁制御用トランジスタ    2SA1015L-GR x 4
//  LED電流制御用抵抗       330Ω x 8
//  トランジスタベース抵抗  10kΩ x 4
//

#include "TimerEvent.h"

// タイマー割り込み管理
TimerEvent ticker;     
#define REFTIME 4

// デジタルピンの定義
#define DIG1  PB12
#define DIG2  PB13
#define DIG3  PB14
#define DIG4  PB15
#define SEGA  PB3
#define SEGB  PB4
#define SEGC  PB6
#define SEGD  PB7
#define SEGE  PB8
#define SEGF  PB9
#define SEGG  PB10
#define SEGP  PB11

// 桁表示ON・OFF
#define DIG_ON   0
#define DIG_OFF  1

// セグメント表示ON・OFF
#define SEG_ON   0
#define SEG_OFF  1

// セグメントビット定義
#define BIT_A 0b10000000
#define BIT_B 0b01000000
#define BIT_C 0b00100000
#define BIT_D 0b00010000
#define BIT_E 0b00001000
#define BIT_F 0b00000100
#define BIT_G 0b00000010
#define BIT_P 0b00000001

// フォントの定義
const uint8_t font[12] = {
  BIT_A|BIT_B|BIT_C|BIT_D|BIT_E|BIT_F,       // 0
  BIT_B|BIT_C,                               // 1
  BIT_A|BIT_B|BIT_G|BIT_E|BIT_D,             // 2
  BIT_A|BIT_B|BIT_G|BIT_C|BIT_D,             // 3
  BIT_F|BIT_B|BIT_G|BIT_C,                   // 4
  BIT_A|BIT_F|BIT_G|BIT_C|BIT_D,             // 5
  BIT_A|BIT_F|BIT_E|BIT_D|BIT_C|BIT_G,       // 6
  BIT_A|BIT_B|BIT_C,                         // 7
  BIT_A|BIT_B|BIT_C|BIT_D|BIT_E|BIT_F|BIT_G, // 8
  BIT_A|BIT_B|BIT_C|BIT_D|BIT_F|BIT_G,       // 9
  0,                                         // ブランク
  BIT_G,                                     // -
};

// 桁制御ピン
const uint8_t pin_dig[4] = {
  DIG1, DIG2, DIG3, DIG4,
};

// セグメント制御ピン
const uint8_t pin_seg[8] = {
  SEGA, SEGB, SEGC, SEGD, SEGE, SEGF, SEGG, SEGP,
};

// 表示用データ
volatile uint8_t digit[4];

// タイマー割り込み呼び出し関数
void dinamic_update() {
  static uint8_t cnt = 0;
  for (uint8_t i = 0; i < 4; i++)
    digitalWrite(pin_dig[i], DIG_OFF); 
  for (uint8_t i = 0; i < 8; i++)  
     digitalWrite(pin_seg[i], digit[cnt] & (0x80>>i) ? SEG_ON:SEG_OFF);
  digitalWrite(pin_dig[cnt], DIG_ON); 
  cnt++; if (cnt == 4) cnt = 0;
}

// データのクリア
void cls() {
  digit[0] = 0; digit[1] = 0; digit[2] = 0; digit[3] = 0;
}

// 数値の設定
void setNumber(uint16_t n, uint8_t dt = 0) {
  if (n>9999)
    return;

  cls();
  uint8_t dec = 0;
  // 4桁目
  if (n >= 1000) {
    digit[0] =font[ n / 1000]; n = n % 1000; dec = 1;
  }
  // 3桁目
  if (n >= 100) {
    digit[1] = font[n / 100]; n = n % 100; dec = 1;
  } else if (dec) {
    digit[1] = font[0];
  }
  // 2桁目
  if (n >= 10) {
    digit[2] = font[n / 10]; n = n % 10; dec = 1;
  } else if(dec) {
    digit[2] = font[0];
  }
  // 1桁目
  digit[3] = font[n];

  // 小数点
  if(dt && dt <=4) {
    digit[4-dt] |= BIT_P;
  }
}

void setup() { 
  //  桁ピンの初期化
  for (uint8_t i = 0; i < 4; i++) {
    pinMode(pin_dig[i], OUTPUT_OPEN_DRAIN);
    digitalWrite(pin_dig[i], DIG_OFF);
  }

  //  セグメントピンの初期化
  for (uint8_t i = 0; i < 8; i++) {
    pinMode(pin_seg[i], OUTPUT_OPEN_DRAIN);
    digitalWrite(pin_seg[i], SEG_OFF);
  }

  // 表示データの初期化
  for (uint8_t i = 0; i < 4; i++) {
    digit[i] = 0;
  }

  // LEDダイナミック点灯用割り込み設定
  ticker.set(REFTIME, dinamic_update);  // REFTIME間隔で dinamic_update()を呼び出す
  ticker.start();                       // タイマー割り込み実行開始
}

void loop() {
  static uint16_t n = 0;
  setNumber (n,millis()%1000>500?1:0);
  delay(100);
  n++; if (n>9999) n = 0;
}

タイマー割り込みは4m秒間隔で実行させています。
一回の割り込みで4桁のうちの1つを表示させています。
全桁更新周期は 4m秒 x 4 = 16m秒 ≒ 1/60秒 です。
これは、人間の目がちらつきを感じない周期です。
これ以上遅くすると、ちらついて見えます。

電圧を5Vではなく、3.3Vにしても問題なく点灯出来ました。
VF 3.3Vとありますが、実際はもっと低い値のようです。

2019年3月17日 (日)

Arduino STM32用タイマー割り込みライブラリを作成しました

Arduino STM32用のタイマー割り込みライブラリを作成しました。

・Arduino STM32用 簡易タイマー割り込みライブラリ (Tamakichi/STM32_TimerEvent)
  https://github.com/Tamakichi/STM32_TimerEvent

Arduino STM32では、最初から強力なタイマー割り込みライブラリがあるのですが、
少々設定が面倒なので、もう少しお手軽に使えるライブラリを作成しました。
(正確には、ラッパークラスライブラリですね)

次のような感じで使います。
BluePillボード上にあるLEDを0.5秒間隔で点滅するスケッチです。
#include "TimerEvent.h"

#define LED_PIN  PC13 // LEDピン

// タイマー割り込み管理
TimerEvent ticker;     

// タイマー割り込み呼び出し関数
void handle_timer() {
  static uint8_t sw = LOW;
  sw = !sw;
  digitalWrite(LED_PIN, sw);      // LEDの制御
}
 
void setup() {
  pinMode(LED_PIN, OUTPUT);
  ticker.set(500, handle_timer);  // 0.5秒間隔で handle_timer()を呼び出す
  ticker.start();                 // タイマー割り込み実行開始
}

void loop() {

}
 

設定できる割り込み間隔は 1ミリ秒 ~ としています。
利用するハードウェアタイマを明示的に指定することが出来ます。

次のような感じで複数のタイマー割り込みを同時実装することも出来ます。
また、割り込み優先度を指定することが出来ます。

// タイマー割り込み管理
TimerEvent ticker1(Timer1);
TimerEvent ticker2(Timer2);
TimerEvent ticker3(Timer3);
TimerEvent ticker4(Timer4);
・・・

ticker1.set(100, handle_timer1); ticker1.setPriority(14);
ticker2.set(200, handle_timer2);
ticker3.set(400, handle_timer3);
ticker4.set(800, handle_timer4);
・・・

ticker1.start();
ticker2.start();
ticker3.start();
ticker4.start();

上記では、ticker1の優先度をticker2 ~ ticker4 よりも上げています。
ticker1は、ticker2 ~ ticker4の割り込み処理実行中に更に割り込んで実行できます。
ticker1の割り込み実行中は、ticker2 ~ ticker4の割り込み実行は保留されます。

割り込み優先度の設定については、シリアル通信、I2C、ピン変化等の割り込み優先度も
考慮して設定する必要があります。

割り込み優先度は0~15の16レベルがあり、
デフォルトでは、すべての割り込み優先度は最低の15が設定(0が最優先)されています。
ただし、同一の優先度の場合は、割り込みベクター番号が小さいほど優先度が高いです。

このたりの詳細については、Arduino STM32の低レベルAPI nvic.h が参考になると思います。
Nested Vector Interrupt Controller (NVIC) support(nvic.h)


元祖 AVR版Arduinoでも割り込み機能はあるのですが、
優先度が固定のため、特定の割り込み処理中でI2C通信が出来ない等、
(I2Cの割り込み優先度は最低レベルに近い)
多重割り込みを使う場合、場合によっては色々と難儀しました。

その点、ARM cortex M3 の割り込み機構 NVIC はかなり強力で自由度があり
使いやすいです。

2019年3月13日 (水)

M5Stack用CardKBをPS/2インタフェース対応にしてみる(3)

前回の続きです。
専用ケーブルを作りました。
また、ファームウェアは若干問題があり、 2019/03/10に修正しています。

Dscn9806

USBコネクタは、秋月電子で販売されている
ケーブル取付用USBコネクタ(Aタイプ オス)を利用しました。

03

熱収縮チューブで固定し、その上から結束バンドで固定しました。

Dscn9808

これなら、抜き差しに耐えられると思います。

ケーブルは、スイッチサイエンスのM5Stack用GROVE互換ケーブル 50 cm(2個入り)
に変更しました。

04

とりあえず、これで完成とします。

今回の製作では、ボードにのっているNeoPixcelで若干ハマりました。

制御に使っているAdafruit NeoPixel ライブラリがNeoPixcel へのデータ送信で
割り込み禁止をかけていて、起動直後のPS/2イニシャル処理を邪魔します。
対策として、起動時のLEDの点滅処理を削除しました。

Arduino(AVR)で割り込みを併用するようなプログラムでは
Adafruit NeoPixel ライブラリは使わない方が良さそうです。

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ホスト機能搭載、
様々なメディアからの起動が可能で、なんでもありのボードです。

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


2019年3月 8日 (金)

M5Stack用CardKBをPS/2インタフェース対応にしてみる(2)

前回の続きです。

GithubにてPS/2インタフェース対応ファームウェアを公開しました。

・ CardKeyBoard PS/2 インタフェース版 ファームウェア
   https://github.com/Tamakichi/CardKeyBoard_PS2
  (2019/03/10 更新しました:  (内容) PS/2イニシャル時0X00送信削除、応答無しでも次に進む、LED点滅廃止

オリジナル版になかった [カナ] [Insert][F1] [F10] キー等を追加しました。
IchigoJamでのローマ字カタカナ入力にも対応しています。

プログラム入力には困らないと思います。

Dscn9772

Dscn9774

ケーブルには次の信号を割り当てています。

02

03

IchigoJamで利用する場合、
ジャンパーワイヤー(オス - オス)を使って、端子に接続でも利用出来ます。
   GND    - GND
   VCC    - 5V or 3.3V
   KBD1  - CLK
   KBD2  - DATA

Dscn9783

USBコネクタ(オス)を用意して、結線してUSB接続でも利用出来ます。

04

キーを押すのが固めですが、公開されているこのキーボード用ケースの
3Dプリンター用データを出力して装着すると、かなり改善されて入力しやすくなりました。

Dscn9780


ファームウェアの書き込みが少々面倒ですが、下記のサイトにて詳しい方法が
分かりやすく解説されています。大変参考になりました。
しかるのち - M5Stack:CardKB ファームウェア更新


2019/03/10 追記

IchigoJam(V1.3.1)での利用で、キーボードを認識しないとの報告があり、
手持ちの世代の違うIchigoJamを試したところ、認識出来ないボードが1つありました。

Dscn9799

下段のビデオ端子が白いボードが認識出来ませんでした。
ファームウェアは1.2.1と古いですが、安定したバージョンです。

調べると、キーボード起動時のLED(NeoPixel)点滅が原因のようです。

制御を行うAdafruit NeoPixelライブラリが内部で割込停止を行っており、
PS/2イニシャル処理(ピン変化を割込みで検知)の邪魔をするようです。

点滅を無くすと認識出来るようになりました。
他のボードは問題なかったので、起動時の微妙なタイミングで発生するようです。
(電源周りの差異で立ち上がりが微妙に違う等)


2019年3月 7日 (木)

M5Stack用CardKBをPS/2インタフェース対応にしてみる(1)

先日入手したI2Cインタフェースの小型キーボードM5Stack用CardKB、
ファームウェアを修正してPS/2 インタフェース対応にしてみました。

I2C接続用端子をそのまま、PS/2 インタフェース用に利用しています。

IchigoJam
豊四季タイニーBASIC Arduino STM32版にて動作確認しましたが、
とりあえず、使えています。

IchogoJamでの利用

Dscn9738

豊四季タイニーBASIC Arduino STM32での利用

Dscn9746

動いている様子(動画)


修正したスケッチはこちらです。

追加としてF1 F10 キー対応、
HOMEInsertPageUpPageDownEndキーが使えるようにしました。

詳細については、週末に整備し、GitHubにてドキュメントを付けて公開したいと思います。

2019年3月 6日 (水)

I2Cインタフェースの小型キーボードを試してみる

AliexpressにてM5Stack用のI2Cインタフェースのキーボードを見つけ、入手しました。

  M5Stack Official CardKB Mini Keyboard Unit MEGA328P GROVE I2C

  02

CardKBに関する情報
  ・M5Stack - docs CardKB
  ・Github M5-ProductExampleCodes/Unit/CARDKB/
  ・frame and key-top for M5Stack CardKB


送料がちょっと高めで、1個だけ購入すると割高のため2個購入しました。
M5Stack公式製品なので、そのうちスイッチサイエンスでも販売されるかもしれません。


到着した製品

Dscn9721

ボード

Dscn9722

ATmega328Pが乗っています。ボードの左下にISP用の端子用のランドがあります。

公開されているファームウェアのソースを見ると、Arduinoでベースのようです。
水晶振動子が無いので、内部RC発信8MHzっぽいです。

とりあえず、豊四季Tiny BASIC for STM32環境でI2C接続で使ってみました。

Dscn9729

コネクタがGROVE仕様のため、長足のシングルピンソケットを加工して、
ブレッドボードでつかえるようにしました。
2mmピッチなので、微妙にピンを曲げています。

Dscn9726 Dscn9727

とりあえず、動作しました。
ただし、豊四季Tiny BASICのI2CR()関数に不具合を見つけ、豊四季Tiny BASICを
少々、修正しました。

01

3.3Vで動作しました。
I2Cのバスクロックは100kHz、400kHzとも試してみましたが動作しました。

ボード上にNeoPixel(LED)が乗っているのですが、
シフトキーのロック、シンボルキーのロック等の状態を、色や点滅で状態を教えてくれます。
文字入力は意外とストレスを感じないですが、タクトスイッチのボタンが固いのが残念です。

ファームウェアがArduinoなので、改造してPS/2インタフェースに変更できるかもしれません。


追記

IchigoJamでもI2Cインタフェースで利用出来ました。

Dscn9733

2019年3月 4日 (月)

Aliexpressで久しぶりにひどい製品が到着

AliexpressにてフラッシュメモリAM29F040を注文したのですが、
久しぶりにひどい詐欺製品が到着しました。

Dscn9720


貼られていたラベルを剥がして再利用した感じです。傷だらけです。

商品説明には、
   Condition:New
の記載があるのですが、これはどうみても新品ではありません。

Aliexoress、まだ、こんな悪質な業者が残っているんですね。
売り手には、文句を言って交渉の上、紛争を起こす予定です。


2019/03/05 追記

紛争を起こしました。
売り手側のミスの可能性もあるため、事前に売り手に問題点を指摘し、
代わりの商品を送付するよう、要求したのですが無言のため紛争を起こしました。

紛争を起こした後、
念のためフラッシュメモリの中身を見てみると、何らかのデータが書き込まれていました。
明らかに中古品です。

Used_ic

これを追加の証拠として提出したところ、業者の回答を待たず、速攻で
AliExpress Case Management Team が調停し、判断を下してくれました。

   Result: (結果)
     Refund: USD 15.00  ,no need to return goods(払い戻し $15、返品する必要なし)


全額払い戻しとなりました。

めでたしめでたし。

« 2019年2月 | トップページ | 2019年4月 »