• 車種別
  • パーツ
  • 整備手帳
  • ブログ
  • みんカラ+

さいとうあのブログ一覧

2022年09月16日 イイね!

ステアリングリモコンでブルートゥースリモコンを制御する件⑥

というわけで、最後に回路図とソースを載せておきます。

ソースは一部にゃんカラさんのコードを流用していることもあり、商用利用は禁止としておきます。商用でこんなことしようと思う人も需要もないと思いますが(笑)

まずは回路図。手書きで汚くてすみません(汗)



そしてソース。

/*
* File: newmain.c
* Author: saito-a
*
* Created on 2022/07/29, 21:36
*/


// PIC16F1769 Configuration Bit Settings

// 'C' source line config statements

// CONFIG1
#pragma config FOSC = INTOSC // Oscillator Selection Bits (INTOSC oscillator: I/O function on CLKIN pin)
#pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled)
#pragma config MCLRE = ON // MCLR Pin Function Select (MCLR/VPP pin function is MCLR)
#pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config BOREN = OFF // Brown-out Reset Enable (Brown-out Reset enabled)
#pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = ON // Internal/External Switchover Mode (Internal/External Switchover Mode is enabled)
#pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)

// CONFIG2
#pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off)
#pragma config PPS1WAY = ON // Peripheral Pin Select one-way control (The PPSLOCK bit cannot be cleared once it is set by software)
#pragma config ZCD = OFF // Zero-cross detect disable (Zero-cross detect circuit is disabled at POR)
#pragma config PLLEN = OFF // Phase Lock Loop enable (4x PLL is always enabled)
#pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
#pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LPBOR = OFF // Low-Power Brown Out Reset (Low-Power BOR is disabled)
#pragma config LVP = ON // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#define _XTAL_FREQ 32000000
#include
#include "Flash.h"

#define Blue 1
#define Orange 2

// SW ap. B
#define NC 0
#define FORWORD 1
#define PREVIOUS 2
#define VOLPLUS 3
#define VOLMINUS 4
#define MUTE 5 //IN BLUE / OUT ORANGE
#define SRC 1
#define RINGUP 2
#define RINGDOWN 3
#define MIC 4

// NAVI Logic 3.3V
#define SW0 0UL // 前 mode
#define SW1 254UL // 1.24V 次 off hook
#define SW2 440UL // 2.15V VOL+ on hook
#define SW3 581UL // 2.84V VOL- mute
#define SWNC 682UL // 3.3V

// VDC_mode definition
#define VDC_ON 0
#define VDC_MULTI 1
#define VDC_OFF 2

// BLE_sw_definition
#define BLE_SW_ON 0
#define BLE_SW_OFF 1



void init(void) {

INTCON = 0b00000000;
T1GCON = 0b00000000;

OSCCON = 0b11110000; // Internal OSC 8MHz(32MHz)

ADCON1 = 0b11100000; // Right justified, AD変換クロック 2.0 micro sec, Vss, Vdd

ANSELA = 0b00000000;
ANSELB = 0b00000000;
ANSELC = 0b11000000; // RC6,RC7
TRISA = 0b00000000;
TRISB = 0b00000000;
TRISC = 0b11000000; // RC6,RC7 is INPUT
PORTA = 0b00000000;
PORTB = 0b01110000; //RB4,RB5,RB6 をBLE_SW_OFF(HIGH)に。 RB7 をVDC SW OFFに
PORTC = 0b00000000;

// DAC for Blue wire (10bit))
DAC1CON0bits.FM = 0b0;
DAC1CON0bits.OE1 = 0b0;
// DAC1CON0bits.OE2 = 0b0; //PIC16F1769には無い出力
DAC1CON0bits.PSS = 0b00;
DAC1CON0bits.NSS = 0b00;
DAC1CON0bits.EN = 1;

// DAC for Orange wire (10bit))
DAC2CON0bits.FM = 0b0;
DAC2CON0bits.OE1 = 0b0;
// DAC2CON0bits.OE2 = 0b0; //PIC16F1769には無い出力
DAC2CON0bits.PSS = 0b00;
DAC2CON0bits.NSS = 0b00;
DAC2CON0bits.EN = 1;


// OP Amp for Blue wire
OPA1CONbits.UG = 1;
OPA1CONbits.ORPOL = 0;
OPA1CONbits.ORM = 0;
OPA1NCHSbits.NCH = 0b0000;
OPA1PCHSbits.PCH = 0b0010; // DAC1 out
OPA1CONbits.EN = 1;

// OP Amp for Orange wire
OPA2CONbits.UG = 1;
OPA2CONbits.ORPOL = 0;
OPA2CONbits.ORM = 0;
OPA2NCHSbits.NCH = 0b0000;
OPA2PCHSbits.PCH = 0b0011; // DAC2 out
OPA2CONbits.EN = 1;



}

// convert analog value to SW number
// 470R
int convSwVal(long sVal) {
int retVal;

if(sVal < 131L) {
// 0R
retVal = 1;
} else if(sVal < 393L) {
// 162R
retVal = 2;
} else if(sVal < 637L) {
// 490R
retVal = 3;
} else if(sVal < 813L) {
// 1.3KR
retVal = 4;
} else if(sVal < 947L) {
// 2.7KR
retVal = 5;
} else {
// 100KR
retVal = 0;
}
return retVal;
}

void outDAC(int Wire, unsigned long AnalogVal) {
switch(Wire) {
case Blue: // Blue wire
DAC1REFH = AnalogVal >> 8;
DAC1REFL = AnalogVal & 0xFF;
DACLDbits.DAC1LD = 0b1;
__delay_us(20);
break;
case Orange: // Orange wire
DAC2REFH = AnalogVal >> 8;
DAC2REFL = AnalogVal & 0xFF;
DACLDbits.DAC2LD = 0b1;
__delay_us(20);
break;

default:
break;
}
}

// Output to pins
void outputSwData(int wire, int SW) {

switch(wire) {
case Blue: // Blue
switch(SW) {
case NC: // (NC)
outDAC(Blue, SWNC);// (NC) 
RB6 = BLE_SW_OFF;
RB5 = BLE_SW_OFF;
RB4 = BLE_SW_OFF;
break;
case VOLPLUS: // VOL +
outDAC(Blue, SW2);// VOL +
break;
case VOLMINUS: // VOL -
outDAC(Blue, SW3);// VOL -
break;
case FORWORD: // >
outDAC(Blue, SW0);// >
if (BLE_SW_OFF == RB4){ //真ん中ボタン押下中(送り長押し継続中)は送りボタンは制御しない
RB5 = BLE_SW_ON;
}
break;
case PREVIOUS: // <
outDAC(Blue, SW1);// <
RB6 = BLE_SW_ON;
break;
case MUTE: // Mute
outDAC(Orange, SW3);
break;
default:
break;
}
break;
case Orange: // Orange
if (SW != MIC){
RB7=0;
}
switch(SW) {
case NC: // (NC)
outDAC(Orange, SWNC);// (NC)
break;
case SRC: // SRC
outDAC(Orange, SW0);// SRC
break;
case MIC: // MIC
RB7 = 1;
break;
case RINGDOWN: // Ring off
outDAC(Orange, SW1);// Ring off
break;
case RINGUP: // Ring up
outDAC(Orange, SW2);// Ring up
break;
default:
break;
}
break;
default:
break;
}
}

void main(void) {
long blueVal;
int blueSw;
long orangeVal;
int orangeSw;

int vdc_mode;
char rom_data;

int time_count=0; //長押しカウンタ
int push=0; //長押しフラグ


init();

// 初期vdc設定読み出し
__delay_ms(3000);

rom_data=(char)FLASH_read(0x1f80);

if (rom_data==1){
vdc_mode = VDC_MULTI;
}
else if (rom_data==2) {
vdc_mode =VDC_OFF;
}
else {
vdc_mode= VDC_ON;
}

// 初期vdc制御

if (vdc_mode == VDC_MULTI) {
RB7 = 1;
__delay_ms(500);
RB7 = 0;
}
else if (vdc_mode == VDC_OFF){
RB7 = 1;
__delay_ms(2500);
RB7 = 0;
}

// BLEswitchペアリング処理
__delay_ms(6000);

RB4 = BLE_SW_ON;

__delay_ms(3000);
RB4 = BLE_SW_OFF;


while(1) {

// Blue wire
ADCON0 = 0b00100001; // AN8 ADC Start (RC6) 8pin
__delay_us(20);
ADCON0bits.GO = 1;
while(ADCON0bits.GO);
blueVal = ADRESL + (ADRESH * 256);
blueSw = convSwVal(blueVal);

outputSwData(Blue, blueSw);

// Orange wire
ADCON0 = 0b00100101; // AN9 ADC Start (RC7) 9pin
__delay_us(20);
ADCON0bits.GO = 1;
while(ADCON0bits.GO);
orangeVal = ADRESL + (ADRESH * 256);
orangeSw = convSwVal(orangeVal);

if(blueSw != MUTE){
outputSwData(Orange, orangeSw);
}

// vdc長押し(約5秒)で初期モード変更
if (orangeSw == MIC){
if (push == 0){
push = 1;
T1CON = 0;
TMR1H = 0;
TMR1L = 0;
PIR1bits.TMR1IF = 0;
T1CON = 0b00110001;
}
if (PIR1bits.TMR1IF == 1){
time_count++;
PIR1bits.TMR1IF = 0;
}
if (time_count == 75){
vdc_mode++;
if (vdc_mode>2){
vdc_mode = 0;
}
FLASH_erase(0x1f80);
FLASH_write(0x1f80,vdc_mode,0);
T1CON = 0;
time_count++;
}
}


// FORWARD長押しで真ん中BLEスイッチON
else if ( blueSw == FORWORD || blueSw == PREVIOUS ){
if (push == 0){
push = 1;
T1CON = 0;
TMR1H = 0;
TMR1L = 0;
PIR1bits.TMR1IF = 0;
T1CON = 0b00110001;
}
if (PIR1bits.TMR1IF == 1){
time_count++;
PIR1bits.TMR1IF = 0;
}
if (time_count == 16){ //長押し検出
if ( blueSw == FORWORD ){ //送り長押し→真ん中ボタンON、送りボタンOFF
RB5 = BLE_SW_OFF; //RB4-ONとRB5-OFFの順番を逆にするとうまく動かない
RB4 = BLE_SW_ON;
}
else if ( blueSw == PREVIOUS ){ //戻り長押し→強制ペアリング 2.2秒 送り&戻りON
RB5 = BLE_SW_ON;
__delay_ms(2200);
}

}
}
else{
push = 0;
T1CON = 0;
time_count =0;

}
}
}


---ソースここまで---

これに加えてMICROCHIP社の発行しているフラッシュメモリの解説PDFの最後の方にある
Flash.c
Flash.h
HEFlash.c
HEFash.h
を一緒にコンパイルして下さい。
Posted at 2022/09/16 21:46:09 | コメント(0) | トラックバック(0) | 日記
2022年09月16日 イイね!

ステアリングリモコンでブルートゥースリモコンを制御する件⑤

昨日のブログで後に少し追記した件。

BLEリモコンのマニュアルを見ると強制ペアリングモードに移行するのに、戻り・送りボタンを両方同時に押すという操作が説明書にありました。これを盛り込むために最終修正。

ステアリングリモコンは抵抗値で押しているボタンを判断していますが、複数のボタンを同時に押すことは想定しておらず検出できません。

なので、戻りボタンを長押し(約1秒)したら強制ペアリングの制御をすることにしました。

プログラムの修正をさくっと行って車で動作確認。強制ペアリングモードに移行することは確認できましたが・・・これ、使いみちがほぼなさそうです。

というのもすでにペアリング済みのスマホとうまく接続ができていないときにこの操作をしてもBLEリモコン側だけの制御ではどうにもならず、スマホ側でペアリングの解除→ペアリングの許可という操作をしなくてはいけません。

これならば、真ん中ボタン長押しでBLEリモコンの電源OFFし、再度長押しでBLEリモコン起動→登録スマホとのペアリングの動作を行うほうが、スマホの操作が必要がなくて良さそうです。

また、少なくともスマホのブルートゥースをONにしておけば、車に乗り込んでエンジンをかけて自動的に接続される動作に不安定さはなかったので、強制ペアリングの機能は不要かもしれません。

それと、話が少し変わりますが、昨日の動作確認でエンジン始動時の自動VCDモード設定の動作が怪しいと書いた件、多分理由がわかりました。

エンジンを切ってもすぐにACCがオフにならず、その間に再度エンジンオンをすると私の作った制御基板は起動時のVDCスイッチ制御を行わない(もしくは変なタイミングで行ってる)ようです。ちゃんとエンジン切ったあと、MFDの画面が消えるくらいまで待ってからエンジンを始動すると問題なく動作しました。

通常の使用では、エンジン切ってすぐにエンジンをONすることもないし、この動作がわかっていれば、自動でモード制御してくれなくても手元でモードを変更すればいいだけなので、こちらの動作はこのままということにしました。

というわけで、ステアリングスイッチで遊ぶのはネタ切れとなりまして、また新たな遊びを見つけない限りはこのままで。

A型の車にA型のステアリングリモコンを買っていたらこんな機能を盛り込もうなんて思わなかったので、A型のステアリングリモコンを買うより開発環境を整えたり部品を買ったりとお金がかかってしまいましたが、盛り込めた機能を考えたら安く済んだかなと思いました(笑)

Posted at 2022/09/16 21:38:39 | コメント(0) | トラックバック(0) | 日記

プロフィール

「@オビワン・ケノービ さん
まだ人工雪なので硬めでザラザラしてますね。
まぁ、シーズンはじめの足慣らしには十分でしたよ〜」
何シテル?   11/27 13:58
趣味の自転車にうつつを抜かしオイル交換等メンテナンスをおろそかにしていたGC8Fが家族旅行中にエンジンブローし廃車に。車はレッカー移動で人間は新幹線で帰宅・・・...
みんカラ新規会員登録

ユーザー内検索

<< 2022/9 >>

     1 2 3
4 5 6 7 8 910
11 12 13 14 15 1617
1819 20 21 222324
25 26 27 2829 30 

ブログカテゴリー

リンク・クリップ

スポーツセレクターをDIYでなんとかする件① 
カテゴリ:その他(カテゴリ未設定)
2024/06/14 06:40:31
CVTコントロールバルブ交換 
カテゴリ:その他(カテゴリ未設定)
2023/06/03 20:38:32
[スバル WRX S4] 整備・・・?WRXの裏コマンド 
カテゴリ:その他(カテゴリ未設定)
2022/11/06 16:15:31

愛車一覧

スバル WRX S4 スバル WRX S4
スキー復活でFFのプレマシーから乗り換え。レヴォーグを買おうと思っていたのですがいつの間 ...
スバル インプレッサ スバル インプレッサ
スバル インプレッサWRXに乗っています。

過去のブログ

2025年
01月02月03月04月05月06月
07月08月09月10月11月12月
2024年
01月02月03月04月05月06月
07月08月09月10月11月12月
2023年
01月02月03月04月05月06月
07月08月09月10月11月12月
2022年
01月02月03月04月05月06月
07月08月09月10月11月12月
2014年
01月02月03月04月05月06月
07月08月09月10月11月12月
ヘルプ利用規約サイトマップ
© LY Corporation