Vol.765 22.Mar.2019

Brutooth接続トランスミッタ&ヘッドセット 高機能な8ビットPIC(4)〜I2C接続 SIMフリータブレット

B Bruetooth接続トランスミッタ&ヘッドセット

by fjk

ケーブル接続イヤホンはどうしてもケーブルが気になりますね。そこで、音声出力端子さえあればBluetooth(以下BT)でワイヤレス化することにしました。BT送信機には小さなAUKEYのBT-C1、ヘッドセットはSURIAのP9で片耳(左右兼用)/両耳(付属別イヤホンも使用)でも視聴できます。マイクも内蔵しているのでスマホのハンズフリー通話(リモコン機能有り)にも使えます。USBでフル充電(2h)すると約12時間使えます。マルチポイント機能搭載し、同時に2台の携帯電話の待ち受け、防水・防滴機能やノイズキャンセル機能があるなど高機能です。

@ ON(接続):どちらも電源スイッチ を長押し(3〜7秒)すると、赤と青いランプが交互に点減し、しばらくして共に青いランプ点灯したら接続完了。
A OFF:トランスミッタの電源スイッチを長押しするとランプが消灯し、電源offとなる。
B 近くに他のBT機器が無い状態で両方を起動すると、自動で接続される。
C スマホなどのBluetooth機能を有効にして、近くの機器を検索、検出機器の[p9]を選べば、ヘッドセットとペアリング完了となる。ただし、2台同時接続はできない。

BT-C1トランスミッタとP9ヘッドセット
(乾電池は大きさ比較のため)


P 高機能な8ビットPIC(4) 〜I2C接続〜

by fjk

PICの動作やメッセージを表示させるため、I2C接続のLCD(AQM0802A、秋月)を使う。PICでI2Cを使うには、MSSPでI2Cを設定する。
I2Cクロックが100kHzになるようBaudRateを設定する。
MSSP 回路図
 タイマー、ADC(RA2)、ピンなどの設定は前回(abc764)とほぼ同じ設定を行いGenerateする。
 MCCでI2Cを使う場合、自動的に割込が使われるので、以下の2つの割込を許可すること。I2Cのクロックは100kHzに。

 INTERRUPT_GlobalInterruptEnable();
 INTERRUPT_PeripheralInterruptEnable();

LCD表示用にLCDライブラリーを作成し、”Add Exsisting Item”でプロジェクトに追加。

 <lcd_lib.c>
/********************************
 *  LCD表示ライブラリ(for AQM0802A)
 *****************************************/
#include "lcd_lib.h"
#include "mcc_generated_files/i2c.h"
#include "mcc_generated_files/mcc.h"
#define   LcdAdr      0x3E
#define   CONTRAST  0x18       // for 5.0V
//#define  CONTRAST  0x30       // for 3.3V
#define   BOOST      0x00       // for 5.0V Bon=off
//#define  BOOST      0x04       // for 3.3V Bon=on
I2C_MESSAGE_STATUS status;
/*********************************
 *  1文字表示データ出力
 *********************************/
void Lcd_data(unsigned char data){
    unsigned char tbuf[2];
    tbuf[0] = 0x40;
    tbuf[1] = data;
    I2C_MasterWrite(tbuf, 2, LcdAdr, &status);
    while(status == I2C_MESSAGE_PENDING);
    __delay_us(30);              //  30usec wait
}
/*******************************
 * 1コマンド出力 
 *******************************/
void Lcd_cmd(unsigned char cmd){
    unsigned char tbuf[2];
    tbuf[0] = 0x00;
    tbuf[1] = cmd;
    I2C_MasterWrite(tbuf, 2, LcdAdr, &status);
    while(status == I2C_MESSAGE_PENDING);
    /* Cleara??Homea?? */
    if((cmd == 0x01)||(cmd == 0x02))
        __delay_ms(2);          // 2msec wait
    else
        __delay_us(30);         // 30usec wait
}
/*******************************
 * 初期化関数 
 *******************************/
void Lcd_init(void){
    __delay_ms(50);          // 50msec wait
    Lcd_cmd(0x38);           // 8bit 2line Normal mode
    Lcd_cmd(0x39);           // 8bit 2line Extend mode
    Lcd_cmd(0x14);           // OSC 183Hz BIAS 1/5
    Lcd_cmd(0x70 + (CONTRAST & 0x0F));
    Lcd_cmd(0x58 + BOOST + (CONTRAST >> 4));
    Lcd_cmd(0x6B);           // Follwer 0x62?
    __delay_ms(300);
    Lcd_cmd(0x38);           // Set Normal mode
    Lcd_cmd(0x01);           // Clear Display
    Lcd_cmd(0x0C);           // Display On
}
/******************************
 * 全消去関数
 ******************************/
void Lcd_clear(void){
    Lcd_cmd(0x01);  
}
/*****************************
 * 文字列表示関数
 *****************************/
void Lcd_str(const unsigned char* ptr){
    while(*ptr != 0)
        Lcd_data(*ptr++);
}
 
   <lcd_lib.h>
/*******************************
 * LCD表示ライブラリヘッダーファイル
 ****************************************/
#define Lcd_L1 0x80
#define Lcd_L2 0xc0

void Lcd_init(void);
void Lcd_cmd(unsigned char cmd);
void Lcd_data(unsigned char data);
void Lcd_str(const unsigned char* ptr);
void Lcd_clear(void);
 
 
   <main.c>
#include <stdio.h>
#include "mcc_generated_files/mcc.h"
#include "lcd_lib.h"

unsigned char rBuf[16];
unsigned char sBuf[16];
char Flag, mFlag;
int Index, Val;

void main(void)
{
    // initialize the device
    SYSTEM_Initialize();
   // global valiabls
    unsigned char sBuf[16];
    mFlag = 0;
    int Val;
    // Enable the Global Interrupts
    INTERRUPT_GlobalInterruptEnable();
    // Enable the Peripheral Interrupts
    INTERRUPT_PeripheralInterruptEnable();
    Lcd_init();
    Lcd_str("Hellow");
    LEDC3_SetHigh();

    while (1)
    {
        Val = ADC_GetConversion(2);
        if(mFlag){
            LEDC3_Toggle();
            mFlag = 0;
            sprintf(sBuf,"ad=%4d",Val);
            Lcd_cmd(Lcd_L2);
            Lcd_str(sBuf);
        }
        
    }
}
起動時の表示 AD変換データを表示

※PICでは標準入出力(printf関数など)はデフォルトで使用できない。これは、標準入出力の低レベル関数であるputch()やgetch()関数の中身が空の状態で定義されているためで、ユーザのシステムに合わせてこの2つの関数を作り、上書きで書き換える必要がある。例えば、シリアル通信で使う場合は、MCCのeuartタブ画面のSoftware_SetingでRedirect_STDIO_to_USARTを最初にチェックしておくとGenerateで自動的にこの2つの関数をeusart.cに作成してくれるが、もし、自動で作成されない場合は、以下のコードをeusart.cに追加すれば、pritf()などの標準入出力関数が使えるようになる。

char getch(void)
{
    return EUSART_Read();
}

void putch(char txData)
{
    EUSART_Write(txData);
}

標準入出力関数を使うと、前回のシリアル通信テストのmain関数は以下のように書き換えできる。
 なお、シリアル受信には割込を利用したいので、getch()関数は使っていない。

   
#include "mcc_generated_files/mcc.h"

unsigned char rBuf[18];
char Flag, mFlag;
int Index, Val;

void main(void)
{
    SYSTEM_Initialize();
    mFlag = 0;
    Index = 0;
    Flag = 0;
    INTERRUPT_GlobalInterruptEnable();
    INTERRUPT_PeripheralInterruptEnable();
    LEDC3_SetHigh();
    puts("Hellow");

    while (1) {
        Val = ADC_GetConversion(2);
        if(mFlag){
            LEDC3_Toggle();
            mFlag = 0;
            printf("ad=%d\n\r", Val);
        }
        if(Flag){
            Flag = 0;
            puts(rBuf);
        }
    }
}

シリアル通信以外(例えばI2C)を標準入出力とするには、低レベル関数を以下のように新しく定義し、上書きすれば良い。

void putch(char Data)
{
    Lcd_data(Data);
}


T SIMフリータブレット(Zenpad Z581KL)

by fjk

スマホのM01を使っているが、地図を使う時にはもっと広い画面で表示したくなったので、NifmoのmicroSIMが使える機種を探していると、2016年発売でQXGA画面を持つZenPad 3 8.0 (Z581KL)が見つかった(購入した2018年秋時点でmicroSIM対応機種は既に少ない)。
 届いたタブレットをWiFi環境で起動すると、設定もほとんど手間無く直ぐに使えた。画面も綺麗で、動画再生でももたつかず、音質も綺麗である。初期の目的であるマップも広域で見やすくなった。さらにofficeファイルを閲覧するためPlayStorから無料のMS-officeを入手すると、大抵のファイルは閲覧・編集できるようになった(Googleから登録端末が違うと警告が一応あったが・・)。

1.ZenPad 3 8.0 (Z581KL)の主な仕様は、(ネットではパソコンとして認識される)
CPU ヘキサコア1.8GHz(Snapdragon 650)
GPU Adreno 510
OS Android 6.0.1(Marshmallow)
メモリ RAM:4GB、ROM:32GB
メモリカード  microSD(HC/XC)、最大128GBまで
SIMカード microSIMフリー(FDD-LTE、TD-LTE、W-CDMA(HSPA+)に対応)
ディスプレイ  7.9インチ 、2048×1536 (QXGA)、LEDバックライト
カメラ 背面800万画素、前面200万画素
無線LAN 802.11.b, 802.11.g, 802.11.n
外部接続 Bluetooth 4.1、Type-C USBポート×1、テザリング対応
外部端子 マイク/ヘッドホン・コンポジャック(4極対応)
オーディオ デュアルフロントスピーカ、アナログマイク
センサ GPS(GLONASS)、加速度、光、電子、磁気、近接、ジャイロ
電池容量 リチウム電池4680mAh (電池駆動時間:約10 時間)
サイズ 205.4 × 136.4 × 7.57mm (このサイズで片手持ちの音声通話は難しそう)
重さ 320グラム (ケース付きで480g )
入手価格 35,800円(税込) (専用ケース、専用保護フイルムは別途購入)

2.通信環境の設定(電源OFF後SIMカードを差込)
@「設定」をクリック
A「ネットワーク/モバイルネットワーク」
B「アクセスポイントの編集」をタップ
  (nifty-APは既に登録済みで、選ぶだけでした)
C もし、無い場合は「+」(追加)をクリック
  ・アクセスポイント:nifty(LTE)
  ・APN:mda.nifty.com
  ・ユーザ:mda@nifty
  ・認証タイプ:CHAP
  ・PDP Type:IP
  ・MCC:440
  ・MNC:10
D 右上のアイコンをタップ後「保存」。

※SIMカードの差し替えが面倒だが、スマホ・タブレットのどちらでも通信が使えるようになった。
ZenPad 3 8.0 (Z581KL)


Bruetooth接続トランスミッタ&ヘッドセット 高機能な8ビットPIC(4)〜I2C接続 SIMフリータブレット