arduino制作电子琴遇到的问题
在使用arduino制作电子琴过程中遇 蜂鸣器发声函数tone()与红外遥控模块函数IRemote冲突问题。本文提供参考两种解决方法的实践过程,思路分别来自以下博客。arduino 定时器、定时中断与PWM使用以及注意事项
arduino使用tone函数播放音乐,调用两个定时器实现双音轨播放
主要思想:修改系统tone()函数库中定时器,使两个函数分别使用不同定时器,从而化解冲突。
tone() 和 IRremote 冲突的解决办法
主要思想: 避免使用系统定义tone()函数,自定义新函数,绕开定时器。
实践1. 修改定时器
在arduino 安装目录下(我的是D:\arduino\hardware\arduino\avr\cores\arduino)中找到Tone.cpp
在大概第100行左右,看代码,修改定时器。代码注释不是很明显,灰色的地方注意一下啊,下面代码中已经修改。
//由于我使用的是MEGA2560的板子,所以在这个地方修改
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
#define AVAILABLE_TONE_PINS 1
//mega1280 mega2560这里修改!!!为TIMER1
#define USE_TIMER1
//这里 修改为1
const uint8_t PROGMEM tone_pin_to_timer_PGM[] = { 1 /*, 3, 4, 5, 1, 0 */ };
static uint8_t tone_pins[AVAILABLE_TONE_PINS] = { 255 /*, 255, 255, 255, 255, 255 */ };
#elif defined(__AVR_ATmega8__)
#define AVAILABLE_TONE_PINS 1
#define USE_TIMER2
const uint8_t PROGMEM tone_pin_to_timer_PGM[] = { 2 /*, 1 */ };
static uint8_t tone_pins[AVAILABLE_TONE_PINS] = { 255 /*, 255 */ };
#elif defined(__AVR_ATmega32U4__)
#define AVAILABLE_TONE_PINS 1
#define USE_TIMER3
const uint8_t PROGMEM tone_pin_to_timer_PGM[] = { 3 /*, 1 */ };
static uint8_t tone_pins[AVAILABLE_TONE_PINS] = { 255 /*, 255 */ };
#else
#define AVAILABLE_TONE_PINS 1
//之前一直在这里改,然后编译不报错,但是不能发出声音,因为执行的是上边mega2560的代码
#define USE_TIMER1
// Leave timer 0 to last.
//const uint8_t PROGMEM tone_pin_to_timer_PGM[] = { 2 /*, 1, 0 */ };
const uint8_t PROGMEM tone_pin_to_timer_PGM[] = { 1 };
static uint8_t tone_pins[AVAILABLE_TONE_PINS] = { 255 /*, 255, 255 */ };
#endif
登录后复制

正常使用tone函数即可。
实践2. 使用自定义函数
直接复制代码,在ino文件中新建这个函数,调用即可。
缺点:效果没有库函数 tone()好,也正是因此我才去改的定时器,使用原生函数
绛旓細瀹炶返1. 淇敼瀹氭椂鍣 鍦arduino 瀹夎鐩綍涓嬶紙鎴戠殑鏄疍:\arduino\hardware\arduino\avr\cores\arduino锛変腑鎵惧埌Tone.cpp 鍦ㄥぇ姒傜100琛屽乏鍙筹紝鐪嬩唬鐮侊紝淇敼瀹氭椂鍣ㄣ備唬鐮佹敞閲婁笉鏄緢鏄庢樉锛岀伆鑹茬殑鍦版柟娉ㄦ剰涓涓嬪晩锛屼笅闈唬鐮佷腑宸茬粡淇敼銆//鐢变簬鎴戜娇鐢ㄧ殑鏄疢EGA2560鐨勬澘瀛愶紝鎵浠ュ湪杩欎釜鍦版柟淇敼 if defined(__AVR_ATme...
绛旓細璁剧疆闂銆傚湪姝e父璁剧疆涓嬶紝arduino鐢靛瓙鐞存寜閿槸涓嶄細鍐茬獊鐨勶紝鎸夐敭鍐茬獊鏄敱浜庤缃棶棰樺鑷寸殑銆傜數瀛愮惔鏄竴绉嶇數瀛愰敭鐩樹箰鍣紝灞炰簬鐢靛瓙闊充箰鍚堟垚鍣ㄣ
绛旓細涓句釜渚嬪瓙锛屽亣璁炬垜浠鍒朵綔涓涓8閿殑鐢靛瓙鐞锛屾瘡涓寜閿搴斾竴涓煶绗︺傛垜浠彲浠ュ皢8涓寜閿垎鍒繛鎺ュ埌74HC165鐨8涓緭鍏ュ紩鑴氫笂锛岀劧鍚庡湪Arduino绋嬪簭涓缃竴涓惊鐜紝涓嶆柇璇诲彇74HC165鐨勮緭鍑烘暟鎹紝骞跺垽鏂摢涓寜閿鎸変笅銆傛牴鎹寜閿殑涓嶅悓锛孉rduino鍙互鍙戝嚭涓嶅悓鐨勯煶绗﹀0闊炽傝繖鏍凤紝鎴戜滑灏卞埄鐢74HC165瀹炵幇浜嗗涓寜閿殑璇诲彇...
绛旓細閲岄潰鏀句簡涓枃鍙傘備笉淇′綘鎵句釜鍠囧彮锛岄┍鍔ㄤ笅锛屽湪涓婇潰鏀句笂璞嗗瓙浠涔堢殑涔熷彲浠ュ姩銆備粬鍞竴灏辨槸涓嶅悓鍠囧彮鍙戠殑棰戠巼涓嶅悓銆傘傛墍浠ヨ繖涓槸鍜氬挌锛岄偅涓挃鍜旂殑銆傘傜被浼鐢靛瓙鐞鎿嶄綔銆傘傝屼笖涓嶆槸鍗曠函涓涓緭鍑洪煶棰戣屾槸澶氫釜杈撳嚭涓嶅悓棰戠巼鐨勫枃鍙屽凡銆
绛旓細鍙互蹇熶娇鐢Arduino涓嶢dobe Flash, Processing, Max/MSP, PureData, SuperCollider绛夎蒋浠剁粨鍚堬紝浣滃嚭浜掑姩浣滃搧銆 Arduino鍙互浣跨敤鐜版湁鐨鐢靛瓙鍏冧欢渚嬪寮鍏虫垨鑰呬紶鎰熷櫒鎴栬呭叾浠栨帶鍒跺櫒浠躲丩ED銆佹杩涢┈杈炬垨鍏朵粬杈撳嚭瑁呯疆銆 Arduino涔熷彲浠ョ嫭绔嬭繍琛岋紝骞朵笌杞欢杩涜浜や簰锛屼緥濡傦細Adobe Flash, Processing, Max/MSP, Pure Data,...