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