Vol.836 7.Jan.2022

マイナポイント・第2弾! USB機能付きPICでパソコンと通信

M マイナポイント・第2弾!

by fjk

 2020年に実施されたマイナポイント還元サービスについてはabc800で紹介したが、2022年1月1日から、その第2弾が実施中である。今回のマイナポイントは以下の3つのメニューがある。

@ マイナンバーカードを新規に取得した方・第1弾を未利用の方に最大5,000円相当のポイント
新規にマイナンバーカードを作成するか、既にマイナーカードを持っていて第1弾で5,000円相当ポイントを使い切っていない方が対象で、現在受付中である。
A 健康保険証での利用登録で7,500円相当ポイント。
マイナンバーカードを健康保険証として使えるようにした方で、現在(1/7時点で)マイナポイントの申込みは可能であるが、ポイント付与開始日は未定である。
B 公金受取口座の登録で7,500円相当ポイント。
現在(1/7時点で)申し込みを受け付けていない。

マイナポイントを得るには、

  1. マイナンバーカードの取得(有効期限内であること。申込みは市町村の窓口へ)
  2. マイナポイントの予約・申込み(マイキーIDの取得)
  3. 利用するキャッシュレス決済サービスを登録する。
  4. 登録したキャッシュレス決済サービスでチャージ又は買い物をするとポイントが付与される。

マイナポイントの手続きは、以下のいずれかで行うことができる。

@ スマートホンから「マイナポイントアプリ」を使い、スマホでマイナンバーカードを読み取る。
A パソコンで「マイキーID作成・登録ソフト」をインストールし、「マイナポイント予約・申込み」ページにアクセスし、マイナンバーカードをカードリーダーで読み取る。
B 市町村窓口、郵便局、コンビニ、携帯ショップなどで手続きをする。

マイキーIDを取得したら、キャシュレス決済サービスにポイントの発行を申し込む。その後、登録したキャッシュレス決済サービスでチャージまたは買い物をすると25%分のポイントが付与される。
(サービスによっては事前に登録が必要なキャシュレス決済サービスもあります)

【参考】マイナポイントの情報ページ
   ホームページ、  決済サービス、  予約・申込、  手続きスポット

なお、マイナンバーカードを健康保険証として登録すると、

@ 就職・転職・引っ越しをしても健康保険証としてずっと使える。
A マイナポータルで特定健診情報や薬剤情報・医療費が見れる。
B マイナポータルで確定申告の医療費控除が簡単にできる。
C 窓口への書類の持参が不要となる。

 マイナンバーカード関連ページ、  マイナンバーカート対応医療機関・薬局


P USB機能付きPICでパソコンと通信 〜PIC16F1455

by fjk

 abc834では、PICのUSRART機能とUSB変換ケーブルを使ってパソコンとUSB通信を行ったが、チップにUSB機能を内蔵するPICがあり、その中でも14ピンとサイズが小さく、また外部発振回路が不要なPIC16F1455を使って、CDC(ComunicationDeviceClass)でUSB通信を行ってみた。
 PICのUSBを使うには、MCCを起動し、

@ system設定画面で、クロックを内蔵16MHz、3倍のPLLとする。
A「USBモジュール」を組み込み、USB設定画面で、「Poling」を選択
B「Generate」を実行するとCDCとして使えるように設定される。
C 自動で作成されたmain.cに(下記の)プログラムを入力する。

※「逆引きPIC電子工作やりたいこと辞典」(後閑哲也、技術評論社)を参考にさせていただいた。

USBテスト用回路図(PIC16F1455) ブレッドボードで試作
(LEDは将来用)
MPLAB_X_IDEのsystem設定
(MCC使用)
MPLAB_X_IDEのUSB設定
(MCC使用)

 Pickit4を接続し、ProjectのpropatiesからPickit4を選ぶ。Pickit4はデフォルトでPICに5Vを(*供給もできるが)供給しないので、USBから5Vを供給するのが良い。その後、Make and Programをクリックし、PICにプログラムを書き込む。
 PICに書込が成功した後、PICとパソコンを再度USBケーブルで接続し、パソコン上でabc834で作成したUSB通信ソフトを使って文字を入力すると、次の文字がPICから返された。

パソコン通信ソフトの画面例

#include        "mcc_generated_files/mcc.h"
static uint8_t  readBuffer[64], writeBuffer[64];
uint8_t         i, numBytesRead;

void main(void)
{
    SYSTEM_Initialize();

    while (1)
    {
        USBDeviceTasks();
        if( USBGetDeviceState() < CONFIGURED_STATE )
            continue;
        if( USBIsDeviceSuspended() == true )
            continue;
        if(USBUSARTIsTxTrfReady() == true){
            numBytesRead = getsUSBUSART(readBuffer,sizeof(readBuffer));
            for(i=0; i < numBytesRead; i++){
                switch(readBuffer[i]){
                    case 0x0A:
                    case 0x0D:
                        writeBuffer[i] = readBuffer[i];
                        break;
                    default:
                        writeBuffer[i] = readBuffer[i]+1;
                        break;
                }
            }
            if(numBytesRead > 0)
                putUSBUSART(writeBuffer,numBytesRead);
        }
        CDCTxService();
    }
}

※ Pickit4でPICに電源(5Vなど)を供給するには、
  1. Projectを右クリックし、PropatiesのCategoriesからPickit4を選ぶ
  2. Option categoriesでPowerを選ぶ
  3. Power target circuit from Pickit4をチェックする(必要であれば電圧も選択)
  4. 「Apply」をクリックすると電源が供給される
注)USB電源と同時にPickitから電源を供給しないように(供給停止は上記の3でチェックを外す)

【使用した主なUSB関数】(MicrochipのHELPページより)

void USBDeviceInit(void)
デバイススタックをデフォルト状態で初期化します。USBモジュールは、すべての内部変数、レジスタ、および割り込みフラグを含めて完全にリセットされます。全てのUSBデバイス関数を呼び出す前に呼び出す必要がある。
void USBDeviceTasks(void)
この関数は、USBデバイス側スタックのメインステートマシン/トランザクションハンドラーです。 USBスタックが「USB_POLLING」モード(usb_device_config.hユーザーオプション)で動作している場合、スタックを介してパケットを送受信するには、USBDeviceTasks()関数を定期的に呼び出す必要があります。
この機能は、USB列挙プロセスに関連する制御転送、およびさまざまなUSBイベント(サスペンドなど)の検出も処理します。
この関数は、USB列挙プロセス中に1.8msごとに少なくとも1回呼び出す必要があります。 列挙プロセスが完了した後(USBGetDeviceState()がCONFIGURED_STATEを返すときに決定できます)、USBDeviceTasks()ハンドラーは、9.8msごとに1回、またはハードウェアUSTAT FIFOを確認するために必要な頻度で、より高速に呼び出されます。 いっぱいになることはありません。
経験則として、USBTransferOnePacket()が呼び出される頻度、または1回/1.8msのいずれか速い方の頻度でUSBDeviceTasks()を呼び出すことをお勧めします。
USBDeviceTasks()を呼び出すときの最小タイミング要件の詳細については、usb_device.cの上部にあるインラインコードコメントを参照してください。
USBスタックが「USB_INTERRUPT」モードで動作している場合、メインループコンテキストからUSBDeviceTasks()を呼び出す必要はありません。USB_INTERRUPTモードでは、USBDeviceTasks()ハンドラーは、USB割り込みが発生したときにのみ実行する必要があるため、割り込みコンテキストからのみ呼び出す必要があります。
USB_DEVICE_STATE USBGetDeviceState(void)
USB上のデバイスの現在の状態を返します。この関数がCONFIGURED_STATEを返すまで、アプリケーションはデータの送受信を試みるべきではない。
bool USBIsDeviceSuspended(void)
USBモジュールがサスペンドモードにあるかどうかを示します。 この関数は、一時停止要求が受信されたことを示すものではありません。USBモジュールの状態のみを反映します。
bool USBUSARTIsTxTrfReady(void)
このマクロは、CDCクラスがさらにデータを送信する準備ができているかどうかを確認するために使用されます。
uint8_t getsUSBUSART(char *buffer, uint8_t len)
USB CDC BulkOUTエンドポイントを介して受信したBYTEの文字列をユーザーの指定した場所にコピーします。 これは非ブロッキング機能です。 使用可能なデータがない場合、データを待機しません。 代わりに、「0」を返し、使用可能なデータがないことを呼び出し元に通知します。
呼び出しが行われ、この関数が戻ったときに未読のデータがバッファに残っている場合、データはフラッシュされ、バスからより多くのデータが受信されます。
Input: *buffer  受信したBYTEを保存する場所へのポインタ
len 予想されるBYTEの数。
Output: uint8_t 実際に受信され、指定されたバッファにコピーされた合計バイト数を示すバイトを返します。戻り値は、0からlen入力値までの任意の値にすることができます。 戻り値0は、新しいCDCバルクOUTエンドポイントデータが利用できなかったことを示します。
void putUSBUSART(char *data, uint8_t length)
データの配列をUSBに書き込みます。このバージョンを使用すると、0x00(通常、文字列伝達関数のいずれかでNULL文字)を転送できます。
Input: char *data ホストに転送されるデータのRAM配列へのポインタ
uint8_t length   転送されるバイト数(255未満である必要があります)。
void CDCTxService(void)
CDCTxService()は、デバイスからホストへのトランザクションを処理します。この関数は、デバイスが構成済みの状態に達した後、メインプログラムループごとに1回呼び出す必要があります。 CDCTxService()を定期的に呼び出さないと、CDCシリアルデータインターフェイスを介してデータがUSBホストに送信されなくなります。


マイナポイント・第2弾! USB機能付きPICでパソコンと通信