From 995bb921c142a4de4903c68737e1dcb94db08784 Mon Sep 17 00:00:00 2001 From: pascallanger Date: Wed, 22 Mar 2017 14:55:55 +0100 Subject: [PATCH 001/121] DM002 protocol protocol number 33 sub_protocol none=0 ch5=flip ch6=led ch7=headless --- Boards/package_MULTI2_index.json | 99 +++++++++++++++++++++ Multiprotocol/Bayang_nrf24l01.ino | 7 +- Multiprotocol/CYRF6936_SPI.ino | 4 + Multiprotocol/DM002_nrf24l01.ino | 141 ++++++++++++++++++++++++++++++ Multiprotocol/Multiprotocol.h | 4 +- Multiprotocol/Multiprotocol.ino | 69 ++++++++++----- Multiprotocol/Validate.h | 1 + Multiprotocol/_Config.h | 24 ++++- 8 files changed, 318 insertions(+), 31 deletions(-) create mode 100644 Boards/package_MULTI2_index.json create mode 100644 Multiprotocol/DM002_nrf24l01.ino diff --git a/Boards/package_MULTI2_index.json b/Boards/package_MULTI2_index.json new file mode 100644 index 0000000..00c7d96 --- /dev/null +++ b/Boards/package_MULTI2_index.json @@ -0,0 +1,99 @@ +{ + "packages": [ + { + "name": "MULTI", + "maintainer": "Pascal", + "help": { + "online": "https://www.rcgroups.com/forums/showthread.php?2165676-DIY-Multiprotocol-TX-Module/page555" + }, + "websiteURL": "https://github.com/pascallanger/DIY-Multiprotocol-TX-Module", + "platforms": [ + { + "name": "Multi 4in1 Atmega328p", + "architecture": "avr", + "version": "1.0.0", + "category": "Multi", + "help": { + "online": "https://www.rcgroups.com/forums/showthread.php?2165676-DIY-Multiprotocol-TX-Module/page555" + }, + "url": "https://github.com/pascallanger/DIY-Multiprotocol-TX-Module", + "archiveFileName": "multi_avr-1.0.0.zip", + "checksum": "SHA-256:ec3ff8a1dc96d3ba6f432b9b837a35fd4174a34b3d2927de1d51010e8b94f9f1", + "size": "15005", + "boards": [ + {"name": "Multi 4in1 Atmega328p"}, + ], + "toolsDependencies": [ + { + "packager": "arduino", + "name": "avr-gcc", + "version": "4.8.1-arduino5" + }, + { + "packager": "arduino", + "name": "avrdude", + "version": "6.0.1-arduino5" + } + ] + }, + { + "name": "Multi 4in1 STM32", + "architecture": "stm32", + "version": "1.0.0", + "category": "Multi", + "help": { + "online": "https://www.rcgroups.com/forums/showthread.php?2165676-DIY-Multiprotocol-TX-Module/page555" + }, + "url": "https://github.com/pascallanger/DIY-Multiprotocol-TX-Module", + "archiveFileName": "multi_stm32-1.0.0.zip", + "checksum": "SHA-256:ec3ff8a1dc96d3ba6f432b9b837a35fd4174a34b3d2927de1d51010e8b94f9f1", + "size": "15005", + "boards": [ + {"name": "Multi 4in1 STM32"}, + ], + "toolsDependencies": [ + { + "packager": "arduino", + "name": "avr-gcc", + "version": "4.8.1-arduino5" + }, + { + "packager": "arduino", + "name": "avrdude", + "version": "6.0.1-arduino5" + } + ] + }, + { + "name": "Multi 4in1 OrangeTX", + "architecture": "xmega", + "version": "1.0.0", + "category": "Multi", + "help": { + "online": "https://www.rcgroups.com/forums/showthread.php?2165676-DIY-Multiprotocol-TX-Module/page555" + }, + "url": "https://github.com/pascallanger/DIY-Multiprotocol-TX-Module", + "archiveFileName": "multi_xmega-1.0.0.zip", + "checksum": "SHA-256:ec3ff8a1dc96d3ba6f432b9b837a35fd4174a34b3d2927de1d51010e8b94f9f1", + "size": "15005", + "boards": [ + {"name": "Multi 4in1 OrangeTX"}, + ], + "toolsDependencies": [ + { + "packager": "arduino", + "name": "avr-gcc", + "version": "4.8.1-arduino5" + }, + { + "packager": "arduino", + "name": "avrdude", + "version": "6.0.1-arduino5" + } + ] + } + ], + "tools":[] + } + ] +} diff --git a/Multiprotocol/Bayang_nrf24l01.ino b/Multiprotocol/Bayang_nrf24l01.ino index 00acd97..043dd0c 100644 --- a/Multiprotocol/Bayang_nrf24l01.ino +++ b/Multiprotocol/Bayang_nrf24l01.ino @@ -121,8 +121,7 @@ static void __attribute__((unused)) BAYANG_send_packet(uint8_t bind) #ifdef BAYANG_HUB_TELEMETRY if (option) { // switch radio to rx as soon as packet is sent - - while (!(NRF24L01_ReadReg(NRF24L01_07_STATUS) & _BV(NRF24L01_07_TX_DS))); + while (!(NRF24L01_ReadReg(NRF24L01_07_STATUS) & _BV(NRF24L01_07_TX_DS))); NRF24L01_WriteReg(NRF24L01_00_CONFIG, 0x03); } #endif @@ -131,7 +130,7 @@ static void __attribute__((unused)) BAYANG_send_packet(uint8_t bind) } #ifdef BAYANG_HUB_TELEMETRY -static void __attribute__((unused)) check_rx(void) +static void __attribute__((unused)) BAYANG_check_rx(void) { if (NRF24L01_ReadReg(NRF24L01_07_STATUS) & _BV(NRF24L01_07_RX_DR)) { // data received from model @@ -204,7 +203,7 @@ uint16_t BAYANG_callback() } if (packet_count > 1) - check_rx(); + BAYANG_check_rx(); packet_count %= 5; } diff --git a/Multiprotocol/CYRF6936_SPI.ino b/Multiprotocol/CYRF6936_SPI.ino index ecab9a4..bbfe7ff 100644 --- a/Multiprotocol/CYRF6936_SPI.ino +++ b/Multiprotocol/CYRF6936_SPI.ino @@ -78,6 +78,7 @@ uint8_t CYRF_Reset() */ void CYRF_GetMfgData(uint8_t data[]) { +#ifndef FORCE_CYRF_ID /* Fuses power on */ CYRF_WriteRegister(CYRF_25_MFG_ID, 0xFF); @@ -85,6 +86,9 @@ void CYRF_GetMfgData(uint8_t data[]) /* Fuses power off */ CYRF_WriteRegister(CYRF_25_MFG_ID, 0x00); +#else + memcpy(data,FORCE_CYRF_ID,6); +#endif } /* diff --git a/Multiprotocol/DM002_nrf24l01.ino b/Multiprotocol/DM002_nrf24l01.ino new file mode 100644 index 0000000..057571b --- /dev/null +++ b/Multiprotocol/DM002_nrf24l01.ino @@ -0,0 +1,141 @@ +/* + This project is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Multiprotocol is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Multiprotocol. If not, see . + */ +// compatible with DM002 + +#if defined(DM002_NRF24L01_INO) + +#include "iface_nrf24l01.h" + +#define DM002_PACKET_PERIOD 6100 // Timeout for callback in uSec +#define DM002_INITIAL_WAIT 500 +#define DM002_PACKET_SIZE 12 // packets have 12-byte payload +#define DM002_RF_BIND_CHANNEL 0x27 +#define DM002_BIND_COUNT 655 // 4 seconds + + +enum DM002_FLAGS { + // flags going to packet[9] + DM002_FLAG_FLIP = 0x01, + DM002_FLAG_LED = 0x02, + DM002_FLAG_HEADLESS = 0x10, +}; + +static void __attribute__((unused)) DM002_send_packet(uint8_t bind) +{ + memcpy(packet+5,(uint8_t *)"\x00\x7F\x7F\x7F\x00\x00\x00",7); + if(bind) + { + packet[0] = 0xAA; + packet[1] = rx_tx_addr[0]; + packet[2] = rx_tx_addr[1]; + packet[3] = rx_tx_addr[2]; + packet[4] = rx_tx_addr[3]; + } + else + { + packet[0]=0x55; + // Throttle : 0 .. 200 + packet[1]=convert_channel_8b_scale(THROTTLE,0,200); + // Other channels min 0x57, mid 0x7F, max 0xA7 + packet[2] = convert_channel_8b_scale(RUDDER,0x57,0xA7); + packet[3] = convert_channel_8b_scale(ELEVATOR, 0x57,0xA7); + packet[4] = convert_channel_8b_scale(AILERON, 0x57,0xA7); + // Features + packet[9] = GET_FLAG(Servo_AUX1,DM002_FLAG_FLIP) + | GET_FLAG(Servo_AUX2,DM002_FLAG_LED) + | GET_FLAG(Servo_AUX3,DM002_FLAG_HEADLESS); + // Packet counter + if(packet_count&0x03) + { + packet_count++; + hopping_frequency_no++; + hopping_frequency_no&=4; + } + packet_count&=0x0F; + packet[10] = packet_count; + packet_count++; + } + //CRC + for(uint8_t i=0;iCYRF6936 MODE_Q303 = 31, // =>NRF24L01 MODE_GW008 = 32, // =>NRF24L01 + MODE_DM002 = 33, // =>NRF24L01 }; enum Flysky @@ -480,6 +481,7 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p -- WK2x01 30 Q303 31 GW008 32 + DM002 33 BindBit=> 0x80 1=Bind/0=No AutoBindBit=> 0x40 1=Yes /0=No RangeCheck=> 0x20 1=Yes /0=No diff --git a/Multiprotocol/Multiprotocol.ino b/Multiprotocol/Multiprotocol.ino index 1bf00c0..c6b795b 100644 --- a/Multiprotocol/Multiprotocol.ino +++ b/Multiprotocol/Multiprotocol.ino @@ -22,13 +22,22 @@ */ #include //#define DEBUG_TX +//#define USE_MY_CONFIG #include "Multiprotocol.h" //Multiprotocol module configuration file #include "_Config.h" +// Let's automatically select the board +// if arm is selected #ifdef __arm__ - #define STM32_BOARD // Let's automatically select this board if arm is selected since this is the only one for now... + #define STM32_BOARD #endif + +//Personal config file +#if defined USE_MY_CONFIG || __has_include("_MyConfig.h") + #include "_MyConfig.h" +#endif + #include "Pins.h" #include "TX_Def.h" #include "Validate.h" @@ -948,6 +957,12 @@ static void protocol_init() remote_callback = GW008_callback; break; #endif + #if defined(DM002_NRF24L01_INO) + case MODE_DM002: + next_callback=initDM002(); + remote_callback = DM002_callback; + break; + #endif #endif } } @@ -1158,35 +1173,41 @@ static uint32_t random_value(void) } #endif -static uint32_t random_id(uint16_t adress, uint8_t create_new) +static uint32_t random_id(uint16_t address, uint8_t create_new) { - uint32_t id=0; + #ifndef FORCE_GLOBAL_ID + uint32_t id=0; - if(eeprom_read_byte((EE_ADDR)(adress+10))==0xf0 && !create_new) - { // TXID exists in EEPROM - for(uint8_t i=4;i>0;i--) + if(eeprom_read_byte((EE_ADDR)(address+10))==0xf0 && !create_new) + { // TXID exists in EEPROM + for(uint8_t i=4;i>0;i--) + { + id<<=8; + id|=eeprom_read_byte((EE_ADDR)address+i-1); + } + if(id!=0x2AD141A7) //ID with seed=0 + return id; + } + // Generate a random ID + #if defined STM32_BOARD + #define STM32_UUID ((uint32_t *)0x1FFFF7E8) + if (!create_new) + id = STM32_UUID[0] ^ STM32_UUID[1] ^ STM32_UUID[2]; + #else + id = random(0xfefefefe) + ((uint32_t)random(0xfefefefe) << 16); + #endif + for(uint8_t i=0;i<4;i++) { - id<<=8; - id|=eeprom_read_byte((EE_ADDR)adress+i-1); + eeprom_write_byte((EE_ADDR)address+i,id); + id>>=8; } - if(id!=0x2AD141A7) //ID with seed=0 - return id; - } - // Generate a random ID - #if defined STM32_BOARD - #define STM32_UUID ((uint32_t *)0x1FFFF7E8) - if (!create_new) - id = STM32_UUID[0] ^ STM32_UUID[1] ^ STM32_UUID[2]; + eeprom_write_byte((EE_ADDR)(address+10),0xf0);//write bind flag in eeprom. + return id; #else - id = random(0xfefefefe) + ((uint32_t)random(0xfefefefe) << 16); + (void)address; + (void)create_new; + return FORCE_GLOBAL_ID; #endif - for(uint8_t i=0;i<4;i++) - { - eeprom_write_byte((EE_ADDR)adress+i,id); - id>>=8; - } - eeprom_write_byte((EE_ADDR)(adress+10),0xf0);//write bind flag in eeprom. - return id; } /**************************/ diff --git a/Multiprotocol/Validate.h b/Multiprotocol/Validate.h index 67c73af..f6077ec 100644 --- a/Multiprotocol/Validate.h +++ b/Multiprotocol/Validate.h @@ -70,6 +70,7 @@ #undef HONTAI_NRF24L01_INO #undef Q303_NRF24L01_INO #undef GW008_NRF24L01_INO + #undef DM002_NRF24L01_INO #endif //Make sure telemetry is selected correctly diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h index 2a0598c..513ca8b 100644 --- a/Multiprotocol/_Config.h +++ b/Multiprotocol/_Config.h @@ -71,6 +71,23 @@ //#define NRF24L01_ENABLE_LOW_POWER +/*****************/ +/*** GLOBAL ID ***/ +/*****************/ +//A global ID is used by most protocols to bind and retain the bind to models. To prevent duplicate IDs, it is automatically +// generated using a random 32 bits number the first time the eeprom is initialized. +//If you have 2 Multi modules which you want to share the same ID so you can use either to control the same RC model +// then you can force the ID to a certain known value using the lines below. +//Default is commented, you should uncoment only for test purpose or if you know exactly what you are doing!!! +//#define FORCE_GLOBAL_ID 0x12345678 + +//Protocols using the CYRF6936 (DSM, Devo, Walkera...) are using the CYRF ID instead which should prevent duplicated IDs. +//If you have 2 Multi modules which you want to share the same ID so you can use either to control the same RC model +// then you can force the ID to a certain known value using the lines below. +//Default is commented, you should uncoment only for test purpose or if you know exactly what you are doing!!! +//#define FORCE_CYRF_ID "\x12\x34\x56\x78\x9A\xBC" + + /****************************/ /*** PROTOCOLS TO INCLUDE ***/ /****************************/ @@ -115,6 +132,7 @@ #define HONTAI_NRF24L01_INO #define Q303_NRF24L01_INO #define GW008_NRF24L01_INO +#define DM002_NRF24L01_INO /**************************/ /*** TELEMETRY SETTINGS ***/ @@ -210,8 +228,8 @@ const PPM_Parameters PPM_prot[15]= { /* 3 */ {MODE_FRSKYD, 0 , 0 , P_HIGH , NO_AUTOBIND , 40 }, // option=fine freq tuning /* 4 */ {MODE_HISKY , Hisky , 0 , P_HIGH , NO_AUTOBIND , 0 }, /* 5 */ {MODE_V2X2 , 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, -/* 6 */ {MODE_DSM , DSM2_22 , 0 , P_HIGH , NO_AUTOBIND , 6 }, // option=number of channels -/* 7 */ {MODE_DEVO , 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, +/* 6 */ {MODE_DSM , DSMX_11 , 0 , P_HIGH , NO_AUTOBIND , 6 }, // option=number of channels +/* 7 */ {MODE_DSM , DSM2_22 , 0 , P_HIGH , NO_AUTOBIND , 6 }, /* 8 */ {MODE_YD717 , YD717 , 0 , P_HIGH , NO_AUTOBIND , 0 }, /* 9 */ {MODE_KN , WLTOYS , 0 , P_HIGH , NO_AUTOBIND , 0 }, /* 10 */ {MODE_SYMAX , SYMAX , 0 , P_HIGH , NO_AUTOBIND , 0 }, @@ -339,6 +357,8 @@ const PPM_Parameters PPM_prot[15]= { CX10WD MODE_GW008 NONE + MODE_DM002 + NONE */ // RX_Num is used for model match. Using RX_Num values different for each receiver will prevent starting a model with the false config loaded... From 8cf6d4f7d891df73b7923f7f91dc00b2845fff99 Mon Sep 17 00:00:00 2001 From: pascallanger Date: Wed, 22 Mar 2017 14:58:59 +0100 Subject: [PATCH 002/121] add DM002 --- Multiprotocol/Multi.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Multiprotocol/Multi.txt b/Multiprotocol/Multi.txt index a52436b..a9c1fd8 100644 --- a/Multiprotocol/Multi.txt +++ b/Multiprotocol/Multi.txt @@ -29,4 +29,5 @@ 29,Q2X2,Q222,Q242,Q282 30,WK2x01,WK2801,WK2401,W6_5_1,W6_6_1,W6_HEL,W6_HEL_I 31,Q303,Q303,CX35,CX10D,CX10WD -32,GW008 \ No newline at end of file +32,GW008 +33,DM002 From 59af0594dcc9ad3e667cba9e770dd56bed8fac5b Mon Sep 17 00:00:00 2001 From: pascallanger Date: Wed, 22 Mar 2017 16:17:12 +0100 Subject: [PATCH 003/121] DM002: correct channels --- Multiprotocol/DM002_nrf24l01.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Multiprotocol/DM002_nrf24l01.ino b/Multiprotocol/DM002_nrf24l01.ino index 057571b..1b5cb0f 100644 --- a/Multiprotocol/DM002_nrf24l01.ino +++ b/Multiprotocol/DM002_nrf24l01.ino @@ -50,8 +50,8 @@ static void __attribute__((unused)) DM002_send_packet(uint8_t bind) packet[1]=convert_channel_8b_scale(THROTTLE,0,200); // Other channels min 0x57, mid 0x7F, max 0xA7 packet[2] = convert_channel_8b_scale(RUDDER,0x57,0xA7); - packet[3] = convert_channel_8b_scale(ELEVATOR, 0x57,0xA7); - packet[4] = convert_channel_8b_scale(AILERON, 0x57,0xA7); + packet[3] = convert_channel_8b_scale(AILERON, 0x57,0xA7); + packet[4] = convert_channel_8b_scale(ELEVATOR, 0xA7, 0x57); // Features packet[9] = GET_FLAG(Servo_AUX1,DM002_FLAG_FLIP) | GET_FLAG(Servo_AUX2,DM002_FLAG_LED) From c21afc3f8ac8986cc95fae65420704586eec04ea Mon Sep 17 00:00:00 2001 From: pascallanger Date: Wed, 22 Mar 2017 16:36:51 +0100 Subject: [PATCH 004/121] Update Protocols_Details.md --- Protocols_Details.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Protocols_Details.md b/Protocols_Details.md index 6292726..1a188a0 100644 --- a/Protocols_Details.md +++ b/Protocols_Details.md @@ -376,6 +376,13 @@ Model: H8S 3D Same channels assignement as above. +##DM002 - *33* +Autobind protocol + +CH1|CH2|CH3|CH4|CH5|CH6|CH7 +---|---|---|---|---|---|--- +A|E|T|R|FLIP|LIGHT|HEADLESS + ##CG023 - *13* Autobind protocol From 1263aa7884f57e96f3675d1bd0613a7ca0564a0f Mon Sep 17 00:00:00 2001 From: pascallanger Date: Wed, 22 Mar 2017 16:41:51 +0100 Subject: [PATCH 005/121] Update Protocols_Details.md --- Protocols_Details.md | 204 +++++++++++++++++++++---------------------- 1 file changed, 101 insertions(+), 103 deletions(-) diff --git a/Protocols_Details.md b/Protocols_Details.md index 1a188a0..61bf945 100644 --- a/Protocols_Details.md +++ b/Protocols_Details.md @@ -1,4 +1,4 @@ -#Protocols details +# Protocols details Here are detailed descriptions of every supported protocols (sorted by RF modules) as well as the available options for each protocol. If you want to see a list of models that use these protocols see the [Models](docs/Models.md) page. @@ -52,9 +52,9 @@ Dial|Protocol|Sub_protocol|RX Num|Power|Auto Bind|Option|RF Module *** -#A7105 RF Module +# A7105 RF Module -##FLYSKY - *1* +## FLYSKY - *1* Extended limits supported CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 @@ -63,30 +63,30 @@ A|E|T|R|CH5|CH6|CH7|CH8 Note that the RX ouput will be AETR. -###Sub_protocol Flysky - *0* +### Sub_protocol Flysky - *0* -###Sub_protocol V9X9 - *1* +### Sub_protocol V9X9 - *1* CH5|CH6|CH7|CH8 ---|---|---|--- FLIP|LIGHT|PICTURE|VIDEO -###Sub_protocol V6X6 - *2* +### Sub_protocol V6X6 - *2* CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12 ---|---|---|---|---|---|---|--- FLIP|LIGHT|PICTURE|VIDEO|HEADLESS|RTH|XCAL|YCAL -###Sub_protocol V912 - *3* +### Sub_protocol V912 - *3* CH5|CH6 ---|--- BTMBTN|TOPBTN -###Sub_protocol CX20 - *4* +### Sub_protocol CX20 - *4* Model: Cheerson Cx-20 CH5|CH6|CH7 ---|---|--- -##FLYSKY AFHDS2A - *28* +## FLYSKY AFHDS2A - *28* Extended limits supported Telemetry enabled for battery voltage and RX&TX RSSI using FrSky Hub protocol @@ -101,10 +101,10 @@ A|E|T|R|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14 Note that the RX ouput will be AETR. -###Sub_protocol PWM_IBUS - *0* -###Sub_protocol PPM_IBUS - *1* -###Sub_protocol PWM_SBUS - *2* -###Sub_protocol PPM_SBUS - *3* +### Sub_protocol PWM_IBUS - *0* +### Sub_protocol PPM_IBUS - *1* +### Sub_protocol PWM_SBUS - *2* +### Sub_protocol PPM_SBUS - *3* ##HUBSAN - *2* Models: Hubsan H102D, H107/L/C/D and Hubsan H107P/C+/D+ @@ -120,9 +120,9 @@ CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9 A|E|T|R|FLIP|LIGHT|PICTURE|VIDEO|HEADLESS *** -#CC2500 RF Module +# CC2500 RF Module -##FRSKYV = FrSky 1 way - *25* +## FRSKYV = FrSky 1 way - *25* Models: FrSky receivers V8R4, V8R7 and V8FR. Extended limits supported @@ -137,7 +137,7 @@ CH1|CH2|CH3|CH4 ---|---|---|--- CH1|CH2|CH3|CH4 -##FRSKYD - *3* +## FRSKYD - *3* Models: FrSky receivers D4R and D8R. DIY RX-F801 and RX-F802 receivers. Also known as D8. Extended limits supported @@ -154,7 +154,7 @@ CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 ---|---|---|---|---|---|---|--- CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 -##FRSKYX - *15* +## FRSKYX - *15* Models: FrSky receivers X4R, X6R and X8R. Also known as D16. Extended limits supported @@ -167,35 +167,35 @@ Option for this protocol is fine frequency tuning. This value is different for e - set the value to half way between min and max. - [video showing the process](https://youtu.be/C483uNWwAaM) -###Sub_protocol CH_16 - *0* +### Sub_protocol CH_16 - *0* FCC protocol 16 channels @18ms. CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14|CH15|CH16 ---|---|---|---|---|---|---|---|---|----|----|----|----|----|----|---- CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14|CH15|CH16 -###Sub_protocol CH_8 - *1* +### Sub_protocol CH_8 - *1* FCC protocol 8 channels @9ms. CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 ---|---|---|---|---|---|---|--- CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 -###Sub_protocol EU_16 - *2* +### Sub_protocol EU_16 - *2* EU-LBT protocol 16 channels @18ms. Note that the LBT part is not implemented, the TX transmits right away. CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14|CH15|CH16 ---|---|---|---|---|---|---|---|---|----|----|----|----|----|----|---- CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14|CH15|CH16 -###Sub_protocol EU_8 - *3* +### Sub_protocol EU_8 - *3* EU-LBT protocol 8 channels @9ms. Note that the LBT part is not implemented, the TX transmits right away. CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 ---|---|---|---|---|---|---|--- CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 -##SFHSS - *21* +## SFHSS - *21* Models: Futaba RXs and XK models. Extended limits supported @@ -211,9 +211,9 @@ CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 A|E|T|R|CH5|CH6|CH7|CH8 *** -#CYRF6936 RF Module +# CYRF6936 RF Module -##DEVO - *7* +## DEVO - *7* Extended limits supported CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 @@ -243,13 +243,13 @@ Bind procedure using PPM: - To verify that the TX is in fixed mode: power cycle the TX, the module LED should be solid ON (no blink). - Note: Autobind/fixed ID mode is linked to the dial number. Which means that you can have multiple dial numbers set to the same protocol DEVO with different RX_Num and have different bind modes at the same time. It enables PPM users to get model match under DEVO. -##WK2X01 - *30* +## WK2X01 - *30* Extended limits supported Autobind protocol Note: RX ouput will always be AETR independently of the input AETR, RETA... -###Sub_protocol WK2801 - *0* +### Sub_protocol WK2801 - *0* This roughly corresponds to the number of channels supported, but many of the newer 6-channel receivers actually support the WK2801 protocol. It is recommended to try the WK2801 protocol 1st when working with older Walkera models before attempting the WK2601 or WK2401 mode, as the WK2801 is a superior protocol. The WK2801 protocol supports up to 8 channels. CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 @@ -277,28 +277,28 @@ Bind procedure using PPM: - To verify that the TX is in fixed mode: power cycle the TX, the module LED should be solid ON (no blink). - Note: Autobind/fixed ID mode is linked to the dial number. Which means that you can have multiple dial numbers set to the same protocol WK2X01 and sub_protocol WK2801 with different RX_Num and have different bind modes at the same time. It enables PPM users to get model match. -###Sub_protocol WK2401 - *1* +### Sub_protocol WK2401 - *1* The WK2401 protocol is used to control older Walkera models. CH1|CH2|CH3|CH4 ---|---|---|--- A|E|T|R -###Sub_protocol W6_5_1 - *2* +### Sub_protocol W6_5_1 - *2* WK2601 5+1: AIL, ELE, THR, RUD, GYRO (ch 7) are proportional. Gear (ch 5) is binary. Ch 6 is disabled CH1|CH2|CH3|CH4|CH5|CH6|CH7 ---|---|---|---|---|---|--- A|E|T|R|GEAR|DIS|GYRO -###Sub_protocol W6_6_1 - *3* +### Sub_protocol W6_6_1 - *3* WK2601 6+1: AIL, ELE, THR, RUD, COL (ch 6), GYRO (ch 7) are proportional. Gear (ch 5) is binary. **This mode is highly experimental.** CH1|CH2|CH3|CH4|CH5|CH6|CH7 ---|---|---|---|---|---|--- A|E|T|R|GEAR|COL|GYRO -###Sub_protocol W6_HEL - *4* and W6HEL_I - *5* +### Sub_protocol W6_HEL - *4* and W6HEL_I - *5* WK2601 Heli: AIL, ELE, THR, RUD, GYRO are proportional. Gear (ch 5) is binary. COL (ch 6) is linked to Thr. If Ch6 >= 0, the receiver will apply a 3D curve to the Thr. If Ch6 < 0, the receiver will apply normal curves to the Thr. The value of Ch6 defines the ratio of COL to THR. W6HEL_I: Invert COL servo @@ -309,7 +309,7 @@ CH1|CH2|CH3|CH4|CH5|CH6|CH7 ---|---|---|---|---|---|--- A|E|T|R|GEAR|COL|GYRO -##DSM - *6* +## DSM - *6* Extended limits supported Telemetry enabled for TSSI and plugins @@ -324,22 +324,22 @@ Notes: - model/type/number of channels indicated on the RX can be different from what the RX is in fact wanting to see. So don't hesitate to test different combinations until you have something working. Using Auto is the best way to find these settings. - RX ouput will always be TAER independently of the input AETR, RETA... -###Sub_protocol DSM2_22 - *0* +### Sub_protocol DSM2_22 - *0* DSM2, Resolution 1024, refresh rate 22ms -###Sub_protocol DSM2_11 - *1* +### Sub_protocol DSM2_11 - *1* DSM2, Resolution 2048, refresh rate 11ms -###Sub_protocol DSMX_22 - *2* +### Sub_protocol DSMX_22 - *2* DSMX, Resolution 2048, refresh rate 22ms -###Sub_protocol DSMX_11 - *3* +### Sub_protocol DSMX_11 - *3* DSMX, Resolution 2048, refresh rate 11ms -###Sub_protocol AUTO - *4* +### Sub_protocol AUTO - *4* The "AUTO" feature enables the TX to automatically choose what are the best settings for your DSM RX and update your model protocol settings accordingly. The current radio firmware which are able to use the "AUTO" feature are ersky9x (9XR Pro, 9Xtreme, Taranis, ...) and er9x for M128 (9XR) and M2561. For these firmwares, you must have a telemetry enabled TX and you have to make sure you set the Telemetry "Usr proto" to "DSMx". Also on er9x you will need to be sure to match the polarity of the telemetry serial (normal or inverted by bitbashing), while on ersky9x you can set "Invert COM1" accordinlgy. -##J6Pro - *22* +## J6Pro - *22* CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12 ---|---|---|---|---|---|---|---|---|----|----|---- @@ -348,7 +348,7 @@ A|E|T|R|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12 *** #NRF24L01 RF Module -##ASSAN - *24* +## ASSAN - *24* Extended limits supported CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 @@ -357,7 +357,7 @@ CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 The transmitter must be close to the receiver while binding. -##BAYANG - *14* +## BAYANG - *14* Models: EAchine H8(C) mini, BayangToys X6/X7/X9, JJRC JJ850, Floureon H101 ... Autobind protocol @@ -366,41 +366,41 @@ CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10 ---|---|---|---|---|---|---|---|---|---- A|E|T|R|FLIP|RTH|PICTURE|VIDEO|HEADLESS|INVERTED -###Sub_protocol BAYANG - *0* +### Sub_protocol BAYANG - *0* Option=0 -> normal Bayang protocol Option=1 -> enable telemetry with [Silverxxx firmware](https://github.com/silver13/H101-acro/tree/master). Value returned to the TX using FrSkyD Hub are RX RSSI, TX RSSI, A1=uncompensated battery voltage, A2=compensated battery voltage -###Sub_protocol H8S3D - *1* +### Sub_protocol H8S3D - *1* Model: H8S 3D Same channels assignement as above. -##DM002 - *33* +## DM002 - *33* Autobind protocol CH1|CH2|CH3|CH4|CH5|CH6|CH7 ---|---|---|---|---|---|--- A|E|T|R|FLIP|LIGHT|HEADLESS -##CG023 - *13* +## CG023 - *13* Autobind protocol CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9 ---|---|---|---|---|---|---|---|--- A|E|T|R|FLIP|LIGHT|PICTURE|VIDEO|HEADLESS -###Sub_protocol CG023 - *0* +### Sub_protocol CG023 - *0* Models: EAchine CG023/CG031/3D X4 -###Sub_protocol YD829 - *1* +### Sub_protocol YD829 - *1* Models: Attop YD-822/YD-829/YD-829C ... CH5|CH6|CH7|CH8|CH9 ---|---|---|---|--- FLIP||PICTURE|VIDEO|HEADLESS -###Sub_protocol H8_3D - *2* +### Sub_protocol H8_3D - *2* Models: EAchine H8 mini 3D, JJRC H20/H22/H11D CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13 @@ -416,7 +416,7 @@ H8 3D: OPT1=RTH then press a direction to enter headless mode (like stock TX), O CAL1: H8 3D acc calib, H20 headless calib CAL2: H11D/H20 acc calib -##CX10 - *12* +## CX10 - *12* Autobind protocol CH1|CH2|CH3|CH4|CH5|CH6 @@ -425,12 +425,12 @@ A|E|T|R|FLIP|RATE Rate: -100%=rate 1, 0%=rate 2, +100%=rate 3 -###Sub_protocol GREEN - *0* +### Sub_protocol GREEN - *0* Models: Cheerson CX-10 green pcb Same channels assignement as above. -###Sub_protocol BLUE - *1* +### Sub_protocol BLUE - *1* Models: Cheerson CX-10 blue pcb & some newer red pcb, CX-10A, CX-10C, CX11, CX12, Floureon FX10, JJRC DHD D1 CH5|CH6|CH7|CH8 @@ -439,39 +439,39 @@ FLIP|RATE|PICTURE|VIDEO Rate: -100%=rate 1, 0%=rate 2, +100%=rate 3 or headless for CX-10A -###Sub_protocol DM007 - *2* +### Sub_protocol DM007 - *2* CH5|CH6|CH7|CH8|CH9 ---|---|---|---|--- FLIP|MODE|PICTURE|VIDEO|HEADLESS -###Sub_protocol JC3015_1 - *4* +### Sub_protocol JC3015_1 - *4* CH5|CH6|CH7|CH8 ---|---|---|--- FLIP|MODE|PICTURE|VIDEO -###Sub_protocol JC3015_2 - *5* +### Sub_protocol JC3015_2 - *5* CH5|CH6|CH7|CH8 ---|---|---|--- FLIP|MODE|LED|DFLIP -###Sub_protocol MK33041 - *6* +### Sub_protocol MK33041 - *6* CH5|CH6|CH7|CH8|CH9|CH10 ---|---|---|---|---|--- FLIP|MODE|PICTURE|VIDEO|HEADLESS|RTH -##Q2X2 - *29* -###Sub_protocol Q222 - *0* +## Q2X2 - *29* +### Sub_protocol Q222 - *0* Models: Q222 v1 and V686 v2 CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12 ---|---|---|---|---|---|---|---|---|---|---|--- A|E|T|R|FLIP|LED|MODULE2|MODULE1|HEADLESS|RTH|XCAL|YCAL -###Sub_protocol Q242 - *1* and Q282 - *2* +### Sub_protocol Q242 - *1* and Q282 - *2* CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12 ---|---|---|---|---|---|---|---|---|---|---|--- @@ -479,26 +479,26 @@ A|E|T|R|FLIP|LED|PICTURE|VIDEO|HEADLESS|RTH|XCAL|YCAL Model: JXD 509 is using Q282 with CH12=Start/Stop motors -##ESKY - *16* +## ESKY - *16* CH1|CH2|CH3|CH4|CH5|CH6 ---|---|---|---|---|--- A|E|T|R|GYRO|PITCH -##FY326 - *20* +## FY326 - *20* CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9 ---|---|---|---|---|---|---|---|--- A|E|T|R|FLIP|RTH|HEADLESS|EXPERT|CALIBRATE -##FQ777 - *23* +## FQ777 - *23* Model: FQ777-124 (with SV7241A) CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 ---|---|---|---|---|---|---|--- A|E|T|R|FLIP|RTH|HEADLESS|EXPERT -##GW008 - *32* +## GW008 - *32* Model: Global Drone GW008 from Banggood There are 3 versions of this small quad, this protocol is for the one with a XNS104 IC in the stock Tx and PAN159CY IC in the quad. The xn297 version is compatible with the CX10 protocol (green pcb). The LT8910 version is not supported yet. @@ -507,96 +507,96 @@ CH1|CH2|CH3|CH4|CH5 ---|---|---|---|--- A|E|T|R|FLIP -##HISKY - *4* -###Sub_protocol Hisky - *0* +## HISKY - *4* +### Sub_protocol Hisky - *0* CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 ---|---|---|---|---|---|---|--- A|E|T|R|GEAR|PITCH|GYRO|CH8 GYRO: -100%=6G, +100%=3G -###Sub_protocol HK310 - *1* +### Sub_protocol HK310 - *1* Models: RX HK-3000, HK3100 and XY3000 (TX are HK-300, HK-310 and TL-3C) CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 ---|---|---|---|---|---|---|--- |||T|R|AUX|T_FSAFE|R_FSAFE|AUX_FSAFE -##KN - *9* +## KN - *9* CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11 ---|---|---|---|---|---|---|---|---|----|---- A|E|T|R|DR|THOLD|IDLEUP|GYRO|Ttrim|Atrim|Etrim Dual Rate: +100%=full range, Throttle Hold: +100%=hold, Idle Up: +100%=3D, GYRO: -100%=6G, +100%=3G -###Sub_protocol WLTOYS - *0* -###Sub_protocol FEILUN - *1* +### Sub_protocol WLTOYS - *0* +### Sub_protocol FEILUN - *1* Same channels assignement as above. -##HONTAI - *26* +## HONTAI - *26* Autobind protocol CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11 ---|---|---|---|---|---|---|---|---|----|---- A|E|T|R|FLIP|LED|PICTURE|VIDEO|HEADLESS|RTH|CAL -###Sub_protocol HONTAI - *0* -###Sub_protocol JJRCX1 - *1* +### Sub_protocol HONTAI - *0* +### Sub_protocol JJRCX1 - *1* CH6| ---| ARM| -###Sub_protocol X5C1 clone - *2* +### Sub_protocol X5C1 clone - *2* -###Sub_protocol FQ777_951 - *3* +### Sub_protocol FQ777_951 - *3* -##MJXQ - *18* +## MJXQ - *18* Autobind protocol CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13 ---|---|---|---|---|---|---|---|---|---|---|---|--- A|E|T|R|FLIP|LED|PICTURE|VIDEO|HEADLESS|RTH|AUTOFLIP|PAN|TILT -###Sub_protocol WLH08 - *0* -###Sub_protocol X600 - *1* +### Sub_protocol WLH08 - *0* +### Sub_protocol X600 - *1* Only 3 TX IDs available, change RX_Num value 0..2 to cycle through them -###Sub_protocol X800 - *2* +### Sub_protocol X800 - *2* Only 3 TX IDs available, change RX_Num value 0..2 to cycle through them -###Sub_protocol H26D - *3* +### Sub_protocol H26D - *3* Only 3 TX IDs available, change RX_Num value 0..2 to cycle through them -###Sub_protocol E010 - *4* +### Sub_protocol E010 - *4* 15 TX IDs available, change RX_Num value 0..14 to cycle through them If the E010 does not respond well to inputs or hard to bind, set Power to Low. -###Sub_protocol H26WH - *5* +### Sub_protocol H26WH - *5* CH6| ---| ARM| Only 1 TX ID available -##MT99XX - *17* +## MT99XX - *17* Autobind protocol CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9 ---|---|---|---|---|---|---|---|--- A|E|T|R|FLIP|LED|PICTURE|VIDEO|HEADLESS -###Sub_protocol MT99 - *0* +### Sub_protocol MT99 - *0* Models: MT99xx -###Sub_protocol H7 - *1* +### Sub_protocol H7 - *1* Models: Eachine H7, Cheerson CX023 -###Sub_protocol YZ - *2* +### Sub_protocol YZ - *2* Model: Yi Zhan i6S Only one model can be flown at the same time since the ID is hardcoded. -###Sub_protocol LS - *3* +### Sub_protocol LS - *3* Models: LS114, 124, 215 CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9 ---|---|---|---|---|---|---|---|--- A|E|T|R|FLIP|INVERT|PICTURE|VIDEO|HEADLESS -###Sub_protocol FY805 - *4* +### Sub_protocol FY805 - *4* Model: FY805 Only 1 ID available @@ -605,14 +605,14 @@ CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9 ---|---|---|---|---|---|---|---|--- A|E|T|R|FLIP||||HEADLESS -##Q303 - *31* +## Q303 - *31* Autobind protocol CH1|CH2|CH3|CH4 ---|---|---|--- A|E|T|R -###Sub_protocol Q303 - *0* +### Sub_protocol Q303 - *0* Q303 warning: this sub_protocol is known to not work at all/properly with 4in1 RF modules. CH5|CH6|CH7|CH8|CH9|CH10|CH11 @@ -621,7 +621,7 @@ AHOLD|FLIP|PICTURE|VIDEO|HEADLESS|RTH|GIMBAL GIMBAL needs 3 position -100%/0%/100% -###Sub_protocol CX35 - *1* +### Sub_protocol CX35 - *1* CH5|CH6|CH7|CH8|CH9|CH10|CH11 ---|---|---|---|---|---|--- ARM|VTX|PICTURE|VIDEO||RTH|GIMBAL @@ -632,14 +632,14 @@ Each toggle of VTX will increment the channel. Gimbal is full range. -###Sub_protocol CX10D - *2* and Sub_protocol CX10WD - *3* +### Sub_protocol CX10D - *2* and Sub_protocol CX10WD - *3* CH5|CH6 ---|--- ARM|FLIP ARM is 3 positions: -100%=land / 0%=manual / +100%=take off -##Shenqi - *19* +## Shenqi - *19* Autobind protocol Model: Shenqiwei 1/20 Mini Motorcycle @@ -650,24 +650,24 @@ CH1|CH2|CH3|CH4 Throttle +100%=full forward,0%=stop,-100%=full backward. -##SLT - *11* +## SLT - *11* Autobind protocol CH1|CH2|CH3|CH4|CH5|CH6 ---|---|---|---|---|--- A|E|T|R|GEAR|PITCH -##Symax - *10* +## Symax - *10* Autobind protocol CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9 ---|---|---|---|---|---|---|---|--- A|E|T|R|FLIP||PICTURE|VIDEO|HEADLESS -###Sub_protocol SYMAX - *0* +### Sub_protocol SYMAX - *0* Models: Syma X5C-1/X11/X11C/X12 -###Sub_protocol SYMAX5C - *1* +### Sub_protocol SYMAX5C - *1* Model: Syma X5C (original) and X2 ##V2X2 - *5* @@ -675,32 +675,30 @@ CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11 ---|---|---|---|---|---|---|---|---|----|---- A|E|T|R|FLIP|LIGHT|PICTURE|VIDEO|HEADLESS|MAG_CAL_X|MAG_CAL_Y -###Sub_protocol V2x2 - *0* +### Sub_protocol V2x2 - *0* Models: WLToys V202/252/272, JXD 385/388, JJRC H6C, Yizhan Tarantula X6 ... PICTURE: also automatic Missile Launcher and Hoist in one direction VIDEO: also Sprayer, Bubbler, Missile Launcher(1), and Hoist in the other dir -###Sub_protocol JXD506 - *1* +### Sub_protocol JXD506 - *1* Model: JXD 506 CH10|CH11|CH12 ---|---|--- Start/Stop|EMERGENCY|CAMERA_UP/DN -##YD717 - *8* +## YD717 - *8* Autobind protocol CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9 ---|---|---|---|---|---|---|---|--- A|E|T|R|FLIP|LIGHT|PICTURE|VIDEO|HEADLESS -###Sub_protocol YD717 - *0* -###Sub_protocol SKYWLKR - *1* -###Sub_protocol SYMAX4 - *2* -###Sub_protocol XINXUN - *3* -###Sub_protocol NIHUI - *4* +### Sub_protocol YD717 - *0* +### Sub_protocol SKYWLKR - *1* +### Sub_protocol SYMAX4 - *2* +### Sub_protocol XINXUN - *3* +### Sub_protocol NIHUI - *4* Same channels assignement as above. - - From ed83471a134a12f57fea407e7bde7454152476f8 Mon Sep 17 00:00:00 2001 From: pascallanger Date: Wed, 22 Mar 2017 16:45:54 +0100 Subject: [PATCH 006/121] Update Protocols_Details.md --- Protocols_Details.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Protocols_Details.md b/Protocols_Details.md index 61bf945..ed1cc96 100644 --- a/Protocols_Details.md +++ b/Protocols_Details.md @@ -106,7 +106,7 @@ Note that the RX ouput will be AETR. ### Sub_protocol PWM_SBUS - *2* ### Sub_protocol PPM_SBUS - *3* -##HUBSAN - *2* +## HUBSAN - *2* Models: Hubsan H102D, H107/L/C/D and Hubsan H107P/C+/D+ Autobind protocol @@ -346,7 +346,7 @@ CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12 A|E|T|R|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12 *** -#NRF24L01 RF Module +# NRF24L01 RF Module ## ASSAN - *24* Extended limits supported @@ -404,7 +404,7 @@ FLIP||PICTURE|VIDEO|HEADLESS Models: EAchine H8 mini 3D, JJRC H20/H22/H11D CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13 ----|---|---|---|---|---|---|--- +---|---|---|---|---|---|---|---|--- FLIP|LIGTH|PICTURE|VIDEO|OPT1|OPT2|CAL1|CAL2|GIMBAL JJRC H20: OPT1=Headless, OPT2=RTH @@ -520,7 +520,7 @@ Models: RX HK-3000, HK3100 and XY3000 (TX are HK-300, HK-310 and TL-3C) CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 ---|---|---|---|---|---|---|--- -|||T|R|AUX|T_FSAFE|R_FSAFE|AUX_FSAFE +| | |T|R|AUX|T_FSAFE|R_FSAFE|AUX_FSAFE ## KN - *9* CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11 @@ -670,7 +670,7 @@ Models: Syma X5C-1/X11/X11C/X12 ### Sub_protocol SYMAX5C - *1* Model: Syma X5C (original) and X2 -##V2X2 - *5* +## V2X2 - *5* CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11 ---|---|---|---|---|---|---|---|---|----|---- A|E|T|R|FLIP|LIGHT|PICTURE|VIDEO|HEADLESS|MAG_CAL_X|MAG_CAL_Y From f714315b0d94e34b8ced4df18c7a9abb72c5136d Mon Sep 17 00:00:00 2001 From: pascallanger Date: Thu, 23 Mar 2017 18:03:11 +0100 Subject: [PATCH 007/121] DM002 update --- Protocols_Details.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Protocols_Details.md b/Protocols_Details.md index ed1cc96..ae37286 100644 --- a/Protocols_Details.md +++ b/Protocols_Details.md @@ -379,9 +379,11 @@ Same channels assignement as above. ## DM002 - *33* Autobind protocol -CH1|CH2|CH3|CH4|CH5|CH6|CH7 ----|---|---|---|---|---|--- -A|E|T|R|FLIP|LIGHT|HEADLESS +**Only 2 TX IDs available, change RX_Num value 0-1 to cycle through them + +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11 +---|---|---|---|---|---|---|---|---|----|---- +A|E|T|R|FLIP|LED|CAMERA1|CAMERA2|HEADLESS|RTH|RATE_LOW ## CG023 - *13* Autobind protocol From 364a66ad0b7ec8a66459e446a9b99e4579e2c40f Mon Sep 17 00:00:00 2001 From: pascallanger Date: Thu, 23 Mar 2017 18:03:43 +0100 Subject: [PATCH 008/121] Update Protocols_Details.md --- Protocols_Details.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Protocols_Details.md b/Protocols_Details.md index ae37286..6f20fe6 100644 --- a/Protocols_Details.md +++ b/Protocols_Details.md @@ -379,7 +379,7 @@ Same channels assignement as above. ## DM002 - *33* Autobind protocol -**Only 2 TX IDs available, change RX_Num value 0-1 to cycle through them +**Only 2 TX IDs available, change RX_Num value 0-1 to cycle through them** CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11 ---|---|---|---|---|---|---|---|---|----|---- From 940a89fa387f5cb21f39dc3873c316642ec36929 Mon Sep 17 00:00:00 2001 From: pascallanger Date: Thu, 23 Mar 2017 18:05:00 +0100 Subject: [PATCH 009/121] DM002: 2 TX ID/RF & features addition --- Multiprotocol/DM002_nrf24l01.ino | 33 ++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/Multiprotocol/DM002_nrf24l01.ino b/Multiprotocol/DM002_nrf24l01.ino index 1b5cb0f..90579fa 100644 --- a/Multiprotocol/DM002_nrf24l01.ino +++ b/Multiprotocol/DM002_nrf24l01.ino @@ -29,7 +29,12 @@ enum DM002_FLAGS { // flags going to packet[9] DM002_FLAG_FLIP = 0x01, DM002_FLAG_LED = 0x02, - DM002_FLAG_HEADLESS = 0x10, + DM002_FLAG_MEDIUM = 0x04, + DM002_FLAG_HIGH = 0x08, + DM002_FLAG_RTH = 0x10, + DM002_FLAG_HEADLESS = 0x20, + DM002_FLAG_CAMERA1 = 0x40, + DM002_FLAG_CAMERA2 = 0x80, }; static void __attribute__((unused)) DM002_send_packet(uint8_t bind) @@ -53,9 +58,13 @@ static void __attribute__((unused)) DM002_send_packet(uint8_t bind) packet[3] = convert_channel_8b_scale(AILERON, 0x57,0xA7); packet[4] = convert_channel_8b_scale(ELEVATOR, 0xA7, 0x57); // Features - packet[9] = GET_FLAG(Servo_AUX1,DM002_FLAG_FLIP) - | GET_FLAG(Servo_AUX2,DM002_FLAG_LED) - | GET_FLAG(Servo_AUX3,DM002_FLAG_HEADLESS); + packet[9] = GET_FLAG(Servo_AUX1,DM002_FLAG_FLIP) + | GET_FLAG(!Servo_AUX2,DM002_FLAG_LED) + | GET_FLAG(Servo_AUX3,DM002_FLAG_CAMERA1) + | GET_FLAG(Servo_AUX4,DM002_FLAG_CAMERA2) + | GET_FLAG(Servo_AUX5,DM002_FLAG_HEADLESS) + | GET_FLAG(Servo_AUX6,DM002_FLAG_RTH) + | GET_FLAG(!Servo_AUX7,DM002_FLAG_HIGH); // Packet counter if(packet_count&0x03) { @@ -123,10 +132,18 @@ uint16_t DM002_callback() static void __attribute__((unused)) DM002_initialize_txid() { - // lani TXID - memcpy(rx_tx_addr,(uint8_t *)"\xAC\xA1\x00\x00\xD5",5); - // lani hopping_frequency - memcpy(hopping_frequency,(uint8_t *)"\x35\x39\x3B\x3D",4); + // Only 2 IDs/RFs are available, RX_NUM is used to switch between them + + // RF channels + if(rx_tx_addr[3]&1) + memcpy(hopping_frequency,(uint8_t *)"\x34\x39\x43\x48",4); + else + memcpy(hopping_frequency,(uint8_t *)"\x35\x39\x3B\x3D",4); + // TX IDs + if(rx_tx_addr[3]&1) + memcpy(rx_tx_addr,(uint8_t *)"\x47\x93\x00\x00\xD5",5); + else + memcpy(rx_tx_addr,(uint8_t *)"\xAC\xA1\x00\x00\xD5",5); } uint16_t initDM002(void) From 32c59cb583750e584669f1813e42f4a3d9d04fa2 Mon Sep 17 00:00:00 2001 From: pascallanger Date: Thu, 23 Mar 2017 20:48:34 +0100 Subject: [PATCH 010/121] DM002 --- Multiprotocol/DM002_nrf24l01.ino | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Multiprotocol/DM002_nrf24l01.ino b/Multiprotocol/DM002_nrf24l01.ino index 90579fa..bfa2a88 100644 --- a/Multiprotocol/DM002_nrf24l01.ino +++ b/Multiprotocol/DM002_nrf24l01.ino @@ -133,17 +133,16 @@ uint16_t DM002_callback() static void __attribute__((unused)) DM002_initialize_txid() { // Only 2 IDs/RFs are available, RX_NUM is used to switch between them - - // RF channels if(rx_tx_addr[3]&1) + { memcpy(hopping_frequency,(uint8_t *)"\x34\x39\x43\x48",4); - else - memcpy(hopping_frequency,(uint8_t *)"\x35\x39\x3B\x3D",4); - // TX IDs - if(rx_tx_addr[3]&1) memcpy(rx_tx_addr,(uint8_t *)"\x47\x93\x00\x00\xD5",5); + } else + { + memcpy(hopping_frequency,(uint8_t *)"\x35\x39\x3B\x3D",4); memcpy(rx_tx_addr,(uint8_t *)"\xAC\xA1\x00\x00\xD5",5); + } } uint16_t initDM002(void) From 063edc032a2a6f1241cfe981ff068e785433cfa4 Mon Sep 17 00:00:00 2001 From: Spectre Date: Mon, 27 Mar 2017 15:59:38 +0200 Subject: [PATCH 011/121] Update Transmitters.md --- docs/Transmitters.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/Transmitters.md b/docs/Transmitters.md index cbaa252..8947f32 100644 --- a/docs/Transmitters.md +++ b/docs/Transmitters.md @@ -7,7 +7,7 @@ There are two different modes to interface the MULTI-Module and the transmitter: Any Tx providing a PPM output (like a trainer port, or a transmitter with a RF module bay) is compatible with the MULTI-module. -##PPM +## PPM The DIY Mulitprotocol module supports industry standard PPM interface that works with all transmitters with either a module bay, and/or a trainer port. Even the older 72MHz FM radios support this standard. @@ -22,7 +22,7 @@ Even in PPM mode it may still be possible to access telemetry information from s For transmitter setup using the PPM protocol go to the [PPM Setup page](PPM_Setup.md) -##Serial +## Serial Transmitters that run er9X, erSky9X or OpenTx firmwares (like the FrSky Taranis, FlySky TH9X and Turnigy 9X family of transmitters) have the option of using a fast serial communication protocol between the Tx and the DIY Multiprotocol module. Using this serial communication protocol has some significant advantages: 1. selecting the specific radio protocol (e.g. DSM) and the sub protocol (e.g. DSMX22) is done directly in the menu system of the Tx (see the picture below) @@ -50,7 +50,7 @@ Transmitter|Firmware Options|Telemetry Enabled Click on your transmitter above to view specific setup instructions. -##Telemetry +## Telemetry To enable serial telemetry you need one of the radios and firmwares listed in the table above and **may** require modifications to your Tx. See the table above. Before attempting telemetry check the following: @@ -59,7 +59,7 @@ To enable serial telemetry you need one of the radios and firmwares listed in th 1. Your transmitter hardware is telemetry enabled, or you have done the required mods. Check the table above. -##Optional Telemetry mod for 9X/R TH9X transmitters +## Optional Telemetry mod for 9X/R TH9X transmitters The telemetry mod for these transmitters has evolved. The original and popular "FrSky Telemetry Mod" requires 2 pins on the transmitter module board to be modified (RX on pin 5 and TX on pin 2). All the recent MULTI-Module hardware options supports serial transmission on pin 1 (the same pin as the PPM signal) so, in this case, only the mod on pin 5 is required. A good tutorial to follow is Oscar Liang's [here](http://blog.oscarliang.net/turnigy-9x-advance-mod/) but when you get to wiring up the Tx Module bay pins, you only need to perform the steps relevant for Pin 5. @@ -67,7 +67,7 @@ A good tutorial to follow is Oscar Liang's [here](http://blog.oscarliang.net/tur You can see Midelic's original instructions [here](http://www.rcgroups.com/forums/showpost.php?p=28359305&postcount=2) -##Other Notes: +## Other Notes: - er9X and erSky9X firmware already supports Multiprotocol Module as a standard feature. The next major release of OpenTx - OpenTx 2.2 - will have DIY Mulitprotocol support as a standard feature. - Owners of Walkera Devo transmitters should look at the [Deviation-Tx](http://www.deviationtx.com) project for how to achieve the same end goal with your transmitters. From dd75c56404d9e819af41b3c28118daf46b51b987 Mon Sep 17 00:00:00 2001 From: midelic Date: Fri, 31 Mar 2017 14:14:08 +0100 Subject: [PATCH 012/121] typo error fix/cosmetics --- docs/Compiling_STM32.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/Compiling_STM32.md b/docs/Compiling_STM32.md index 00cfbd4..2c73cc1 100644 --- a/docs/Compiling_STM32.md +++ b/docs/Compiling_STM32.md @@ -47,8 +47,8 @@ Flashing precompiled **binaries** is done very simple with the cable setup prese **usart_irq(&usart3_rb, USART3_BASE);** -**} -*/** +**}** +***/** 1. Run the IDE, and on the **Tools** menu, select **Board** and then **Boards manager**. Click on the Arduino DUE (32 Bits ARM-Cortex M3) from the list of available boards. You must do this step, it installs the arm-none-eabi-g++ toolchain! @@ -93,7 +93,7 @@ This method use USB connector on the STM32 V1.0 board or on the maple clone boar 1. Install first maple USB driver by running the batch file found in Arduino STM32 package folder "..\hardware\Arduino_STM32\drivers\win\install_drivers.bat" 1. Download the free STM32 flash loader demonstrator from [ST.com](http://www.st.com/en/development-tools/flasher-stm32.html) and using a USB-TTL device (like FTDI cable) flash the STM32duino bootloader available from Roger Clark's great STM32 site [here](https://github.com/rogerclarkmelbourne/STM32duino-bootloader/tree/master/STM32F1/binaries) .Use bootloader **generic_boot20_pa1.bin** 1. Open Arduino IDE,browse to multiprotocol folder,load the sketch multiprotocol.ino. -1. In Arduino IDE under "Upload method" select **STM32duino**-bootloader.Wait until upload is complete. +1. In Arduino IDE under "Upload method" select **STM32duino**-bootloader.Click upload ,wait until upload is complete. Notes: - When you use multiSTM32_USB for the first time,the USB drivers are not recognized and port is not open/recognized(arduino IDE port selection is grey/unavailable). After this first time use, any subsequent update of the program, you'll have to select the correct serial port and upload sketches normally in Arduino using USB port. From 681e3a6865b6ac840cc7f959350d300ce2c9f7f5 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Fri, 31 Mar 2017 16:07:28 +0200 Subject: [PATCH 013/121] Fix formatting, add multimodule companion option --- docs/Tx-Taranis.md | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/docs/Tx-Taranis.md b/docs/Tx-Taranis.md index adf90f2..567bc9d 100644 --- a/docs/Tx-Taranis.md +++ b/docs/Tx-Taranis.md @@ -17,15 +17,19 @@ The MULTI-module can be used with all transmitters and firmwares in PPM mode. T ## PPM Mode Please refer to the [PPM Setup](PPM_Setup.md) page. -##Serial mode -###Enabling Serial Mode +## Serial mode +### Enabling Serial Mode To operate in serial mode, you need one of these firmwares: 1. erSky9x - 1. OpenTx supporting the MULTI-Module (Version 2.1.8 Multi or later) + 1. OpenTx supporting the MULTI-Module (Version 2.1.8 Multi or later, 2.2 recommended) Check and upload a supported firmware. The latest available version at time of writing are: - erSky9x Revision 218 or later - the hex files are available [here](http://www.er9x.com) (Mike's latests test versions are available [here](http://openrcforums.com/forum/viewtopic.php?f=7&t=4676)). - - OpenTx 2.1.8 Multi or later - the hex files are available [here](http://plaisthos.de/opentx/) + - OpenTx 2.2RC10 or later [www.open-tx.org](http://www.open-tx.org/) + + Please make sure that the "multimodule" option in OpenTX Companion is checked: +   +   Tutorials for uploading new firmware using the SD Card are available [here](http://www.dronetrest.com/t/how-to-upgrade-firmware-for-frsky-taranis-x9d/959) or the CompanionTx or eepe software (recommended) are available [here](http://open-txu.org/home/undergraduate-courses/fund-of-opentx/part-2-flashing-opentx/). @@ -43,12 +47,12 @@ First, confirm that the MULTI-Module has the required physical connections betwe The Red LED on the MULTI-Module should briefly flash and then stay on. This confirms that the MULTI-Module module has established serial communication with the Tx. 4. If the red LED on the module continues to flash at a period of about 1s then it signals that serial communication has not been established. Check your settings under the model menu as described above and check that the protocol selection switch on the module is at 0 (zero). If there is still no communication, power down and power up the Tx. Finally check that you have correctly enabled your module for serial as described in specific pages for your module hardware (under the section "Enabling Serial") linked [here](Hardware.md) -###Protocol Selection in Serial mode +### Protocol Selection in Serial mode To select the protocol, scroll through the available options under the Model Settings menu. Depending on which protocol you have selected you may be required to select a sup-protocol and options. For example, the FrSky protocol has three sub-protocols FrSkyV, FrSkyD and FrSkyX. Each of the sub-protocols may have options that specify the number of channels and the packet frame rate, etc. The following picture shows DSM – DSMX – Option 6 (6 channels and 11ms frame rate). Check out the [Protocol Details](Protocol_Details.md) page for detailed information and suggestions regarding the sub-protocols and options. -###Protcol Status in Serial mode (OpenTX) +### Protcol Status in Serial mode (OpenTX) If you see ```NO MULTI_TELEMETRY``` or no ```NO TELEMETRY``` in the setup screen of the external module, like this: @@ -64,7 +68,7 @@ you are missing the ```MULTI_TELEMETRY``` and/or ```INVERT_TELEMTRY``` option in (Module is currently binding and code on the module is running V1.1.6.10) -###Binding in Serial mode +### Binding in Serial mode 1. Switch on the model or put the receiver into bind mode 1. On the transmitter go to the Model Settings menu and scroll down to the [Bind] menu option and press Enter. 1. Press Enter again to exit Bind mode From 804d5723c2cc57f40bc47b2a79e64fa10e529c13 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Fri, 31 Mar 2017 16:09:24 +0200 Subject: [PATCH 014/121] Add image --- docs/images/opentx-config-multi.png | Bin 0 -> 134857 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/images/opentx-config-multi.png diff --git a/docs/images/opentx-config-multi.png b/docs/images/opentx-config-multi.png new file mode 100644 index 0000000000000000000000000000000000000000..c52c113221fe91ee9aec793d73786836bedadcae GIT binary patch literal 134857 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�d$Y*q7gQ9M#4eocURXzVo=>piUZ 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 literal 0 HcmV?d00001 From b904e6a8898a2c8ccdc9d1a03eebe6f3f47cbbda Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Fri, 31 Mar 2017 16:33:56 +0200 Subject: [PATCH 015/121] Highlight the option in the screenshot --- docs/images/opentx-config-multi.png | Bin 134857 -> 98696 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/images/opentx-config-multi.png b/docs/images/opentx-config-multi.png index c52c113221fe91ee9aec793d73786836bedadcae..645d7b5d291acbb435b927f40c5e7be93af6afc1 100644 GIT binary patch literal 98696 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 z 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

F#Yb#NLGS3uEq~vMmjo$l%vjT(>Q)osrG~ZMj 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

fjsKt7_5WxaokjlL>RH$z3S>{enm9OQFj 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�d$Y*q7gQ9M#4eocURXzVo=>piUZ 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 From 9282828ffc87bed70683b8b17925926c4f343a98 Mon Sep 17 00:00:00 2001 From: midelic Date: Mon, 3 Apr 2017 08:16:14 +0100 Subject: [PATCH 016/121] Add updated multi_STM32 board V1.1 --- .../V1.1/Multiprotocol_STM32_MB_1.1_t.brd | 5272 +++++ .../V1.1/Multiprotocol_STM32_MB_1.1_t.sch | 17649 ++++++++++++++++ 2 files changed, 22921 insertions(+) create mode 100644 STM32 PCB/V1.1/Multiprotocol_STM32_MB_1.1_t.brd create mode 100644 STM32 PCB/V1.1/Multiprotocol_STM32_MB_1.1_t.sch diff --git a/STM32 PCB/V1.1/Multiprotocol_STM32_MB_1.1_t.brd b/STM32 PCB/V1.1/Multiprotocol_STM32_MB_1.1_t.brd new file mode 100644 index 0000000..661a19b --- /dev/null +++ b/STM32 PCB/V1.1/Multiprotocol_STM32_MB_1.1_t.brd @@ -0,0 +1,5272 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ANT +1-2: BOOT0 +2-3: NC +BIND + +TX +RX +Vin +GND +MULTI-STM32 + +1-2: 3V3 +2-3: 5V +V1.1 (c) M. Bloos +(CC)-BY-NC-SA 4.0 +MISO**MOSI + CS**SCK +GND**3V3 + + + + + + ++ ++ ++ ++ ++ + + + +<h3>SparkFun Electronics' preferred foot prints</h3> +In this library you'll find crystals and oscillators and other things that go "tick".<br><br> +We've spent an enormous amount of time creating and checking these footprints and parts, but it is the end user's responsibility to ensure correctness and suitablity for a given componet or application. If you enjoy using this library, please buy one of our products at www.sparkfun.com. +<br><br> +<b>Licensing:</b> CC v3.0 Share-Alike You are welcome to use this library for commercial purposes. For attribution, we ask that when you begin to sell your device using our footprint, you email us with a link to the product being sold. We want bragging rights that we helped (in a very small part) to create your 8th world wonder. We would like the opportunity to feature your device on our homepage. + + + + + + + + + + + +>Name +>Value + + + + +<h3>SparkFun Electronics' preferred foot prints</h3> +In this library you'll find drivers, regulators, and amplifiers.<br><br> +We've spent an enormous amount of time creating and checking these footprints and parts, but it is the end user's responsibility to ensure correctness and suitablity for a given componet or application. If you enjoy using this library, please buy one of our products at www.sparkfun.com. +<br><br> +<b>Licensing:</b> Creative Commons ShareAlike 4.0 International - https://creativecommons.org/licenses/by-sa/4.0/ +<br><br> +You are welcome to use this library for commercial purposes. For attribution, we ask that when you begin to sell your device using our footprint, you email us with a link to the product being sold. We want bragging rights that we helped (in a very small part) to create your 8th world wonder. We would like the opportunity to feature your device on our homepage. + + +<b>SOT-223</b> + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + +<b>Resistors, Capacitors, Inductors</b><p> +Based on the previous libraries: +<ul> +<li>r.lbr +<li>cap.lbr +<li>cap-fe.lbr +<li>captant.lbr +<li>polcap.lbr +<li>ipc-smd.lbr +</ul> +All SMD packages are defined according to the IPC specifications and CECC<p> +<author>Created by librarian@cadsoft.de</author><p> +<p> +for Electrolyt Capacitors see also :<p> +www.bccomponents.com <p> +www.panasonic.com<p> +www.kemet.com<p> +<p> +for trimmer refence see : <u>www.electrospec-inc.com/cross_references/trimpotcrossref.asp</u><p> + +<map name="nav_main"> +<area shape="rect" coords="0,1,140,23" href="../military_specs.asp" title=""> +<area shape="rect" coords="0,24,140,51" href="../about.asp" title=""> +<area shape="rect" coords="1,52,140,77" href="../rfq.asp" title=""> +<area shape="rect" coords="0,78,139,103" href="../products.asp" title=""> +<area shape="rect" coords="1,102,138,128" href="../excess_inventory.asp" title=""> +<area shape="rect" coords="1,129,138,150" href="../edge.asp" title=""> +<area shape="rect" coords="1,151,139,178" href="../industry_links.asp" title=""> +<area shape="rect" coords="0,179,139,201" href="../comments.asp" title=""> +<area shape="rect" coords="1,203,138,231" href="../directory.asp" title=""> +<area shape="default" nohref> +</map> + +<html> + +<title></title> + + <LINK REL="StyleSheet" TYPE="text/css" HREF="style-sheet.css"> + +<body bgcolor="#ffffff" text="#000000" marginwidth="0" marginheight="0" topmargin="0" leftmargin="0"> +<table border=0 cellspacing=0 cellpadding=0 width="100%" cellpaddding=0 height="55%"> +<tr valign="top"> + +</td> +<! <td width="10">&nbsp;</td> +<td width="90%"> + +<b><font color="#0000FF" size="4">TRIM-POT CROSS REFERENCE</font></b> +<P> +<TABLE BORDER=0 CELLSPACING=1 CELLPADDING=2> + <TR> + <TD COLSPAN=8> + <FONT SIZE=3 FACE=ARIAL><B>RECTANGULAR MULTI-TURN</B></FONT> + </TD> + </TR> + <TR> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">BOURNS</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">BI&nbsp;TECH</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">DALE-VISHAY</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">PHILIPS/MEPCO</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">MURATA</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">PANASONIC</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">SPECTROL</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">MILSPEC</FONT> + </B> + </TD><TD>&nbsp;</TD> + </TR> + <TR> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3 > + 3005P<BR> + 3006P<BR> + 3006W<BR> + 3006Y<BR> + 3009P<BR> + 3009W<BR> + 3009Y<BR> + 3057J<BR> + 3057L<BR> + 3057P<BR> + 3057Y<BR> + 3059J<BR> + 3059L<BR> + 3059P<BR> + 3059Y<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + 89P<BR> + 89W<BR> + 89X<BR> + 89PH<BR> + 76P<BR> + 89XH<BR> + 78SLT<BR> + 78L&nbsp;ALT<BR> + 56P&nbsp;ALT<BR> + 78P&nbsp;ALT<BR> + T8S<BR> + 78L<BR> + 56P<BR> + 78P<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + T18/784<BR> + 783<BR> + 781<BR> + -<BR> + -<BR> + -<BR> + 2199<BR> + 1697/1897<BR> + 1680/1880<BR> + 2187<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + 8035EKP/CT20/RJ-20P<BR> + -<BR> + RJ-20X<BR> + -<BR> + -<BR> + -<BR> + 1211L<BR> + 8012EKQ&nbsp;ALT<BR> + 8012EKR&nbsp;ALT<BR> + 1211P<BR> + 8012EKJ<BR> + 8012EKL<BR> + 8012EKQ<BR> + 8012EKR<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + 2101P<BR> + 2101W<BR> + 2101Y<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 2102L<BR> + 2102S<BR> + 2102Y<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + EVMCOG<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + 43P<BR> + 43W<BR> + 43Y<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 40L<BR> + 40P<BR> + 40Y<BR> + 70Y-T602<BR> + 70L<BR> + 70P<BR> + 70Y<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + RT/RTR12<BR> + RT/RTR12<BR> + RT/RTR12<BR> + -<BR> + RJ/RJR12<BR> + RJ/RJR12<BR> + RJ/RJR12<BR></FONT> + </TD> + </TR> + <TR> + <TD COLSPAN=8>&nbsp; + </TD> + </TR> + <TR> + <TD COLSPAN=8> + <FONT SIZE=4 FACE=ARIAL><B>SQUARE MULTI-TURN</B></FONT> + </TD> + </TR> + <TR> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>BOURN</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>BI&nbsp;TECH</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>DALE-VISHAY</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>PHILIPS/MEPCO</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>MURATA</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>PANASONIC</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>SPECTROL</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>MILSPEC</B></FONT> + </TD> + </TR> + <TR> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 3250L<BR> + 3250P<BR> + 3250W<BR> + 3250X<BR> + 3252P<BR> + 3252W<BR> + 3252X<BR> + 3260P<BR> + 3260W<BR> + 3260X<BR> + 3262P<BR> + 3262W<BR> + 3262X<BR> + 3266P<BR> + 3266W<BR> + 3266X<BR> + 3290H<BR> + 3290P<BR> + 3290W<BR> + 3292P<BR> + 3292W<BR> + 3292X<BR> + 3296P<BR> + 3296W<BR> + 3296X<BR> + 3296Y<BR> + 3296Z<BR> + 3299P<BR> + 3299W<BR> + 3299X<BR> + 3299Y<BR> + 3299Z<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + 66P&nbsp;ALT<BR> + 66W&nbsp;ALT<BR> + 66X&nbsp;ALT<BR> + 66P&nbsp;ALT<BR> + 66W&nbsp;ALT<BR> + 66X&nbsp;ALT<BR> + -<BR> + 64W&nbsp;ALT<BR> + -<BR> + 64P&nbsp;ALT<BR> + 64W&nbsp;ALT<BR> + 64X&nbsp;ALT<BR> + 64P<BR> + 64W<BR> + 64X<BR> + 66X&nbsp;ALT<BR> + 66P&nbsp;ALT<BR> + 66W&nbsp;ALT<BR> + 66P<BR> + 66W<BR> + 66X<BR> + 67P<BR> + 67W<BR> + 67X<BR> + 67Y<BR> + 67Z<BR> + 68P<BR> + 68W<BR> + 68X<BR> + 67Y&nbsp;ALT<BR> + 67Z&nbsp;ALT<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 5050<BR> + 5091<BR> + 5080<BR> + 5087<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + T63YB<BR> + T63XB<BR> + -<BR> + -<BR> + -<BR> + 5887<BR> + 5891<BR> + 5880<BR> + -<BR> + -<BR> + -<BR> + T93Z<BR> + T93YA<BR> + T93XA<BR> + T93YB<BR> + T93XB<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 8026EKP<BR> + 8026EKW<BR> + 8026EKM<BR> + 8026EKP<BR> + 8026EKB<BR> + 8026EKM<BR> + 1309X<BR> + 1309P<BR> + 1309W<BR> + 8024EKP<BR> + 8024EKW<BR> + 8024EKN<BR> + RJ-9P/CT9P<BR> + RJ-9W<BR> + RJ-9X<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 3103P<BR> + 3103Y<BR> + 3103Z<BR> + 3103P<BR> + 3103Y<BR> + 3103Z<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 3105P/3106P<BR> + 3105W/3106W<BR> + 3105X/3106X<BR> + 3105Y/3106Y<BR> + 3105Z/3105Z<BR> + 3102P<BR> + 3102W<BR> + 3102X<BR> + 3102Y<BR> + 3102Z<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + EVMCBG<BR> + EVMCCG<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 55-1-X<BR> + 55-4-X<BR> + 55-3-X<BR> + 55-2-X<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 50-2-X<BR> + 50-4-X<BR> + 50-3-X<BR> + -<BR> + -<BR> + -<BR> + 64P<BR> + 64W<BR> + 64X<BR> + 64Y<BR> + 64Z<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + RT/RTR22<BR> + RT/RTR22<BR> + RT/RTR22<BR> + RT/RTR22<BR> + RJ/RJR22<BR> + RJ/RJR22<BR> + RJ/RJR22<BR> + RT/RTR26<BR> + RT/RTR26<BR> + RT/RTR26<BR> + RJ/RJR26<BR> + RJ/RJR26<BR> + RJ/RJR26<BR> + RJ/RJR26<BR> + RJ/RJR26<BR> + RJ/RJR26<BR> + RT/RTR24<BR> + RT/RTR24<BR> + RT/RTR24<BR> + RJ/RJR24<BR> + RJ/RJR24<BR> + RJ/RJR24<BR> + RJ/RJR24<BR> + RJ/RJR24<BR> + RJ/RJR24<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + </TR> + <TR> + <TD COLSPAN=8>&nbsp; + </TD> + </TR> + <TR> + <TD COLSPAN=8> + <FONT SIZE=4 FACE=ARIAL><B>SINGLE TURN</B></FONT> + </TD> + </TR> + <TR> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>BOURN</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>BI&nbsp;TECH</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>DALE-VISHAY</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>PHILIPS/MEPCO</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>MURATA</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>PANASONIC</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>SPECTROL</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>MILSPEC</B></FONT> + </TD> + </TR> + <TR> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 3323P<BR> + 3323S<BR> + 3323W<BR> + 3329H<BR> + 3329P<BR> + 3329W<BR> + 3339H<BR> + 3339P<BR> + 3339W<BR> + 3352E<BR> + 3352H<BR> + 3352K<BR> + 3352P<BR> + 3352T<BR> + 3352V<BR> + 3352W<BR> + 3362H<BR> + 3362M<BR> + 3362P<BR> + 3362R<BR> + 3362S<BR> + 3362U<BR> + 3362W<BR> + 3362X<BR> + 3386B<BR> + 3386C<BR> + 3386F<BR> + 3386H<BR> + 3386K<BR> + 3386M<BR> + 3386P<BR> + 3386S<BR> + 3386W<BR> + 3386X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 25P<BR> + 25S<BR> + 25RX<BR> + 82P<BR> + 82M<BR> + 82PA<BR> + -<BR> + -<BR> + -<BR> + 91E<BR> + 91X<BR> + 91T<BR> + 91B<BR> + 91A<BR> + 91V<BR> + 91W<BR> + 25W<BR> + 25V<BR> + 25P<BR> + -<BR> + 25S<BR> + 25U<BR> + 25RX<BR> + 25X<BR> + 72XW<BR> + 72XL<BR> + 72PM<BR> + 72RX<BR> + -<BR> + 72PX<BR> + 72P<BR> + 72RXW<BR> + 72RXL<BR> + 72X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + T7YB<BR> + T7YA<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + TXD<BR> + TYA<BR> + TYP<BR> + -<BR> + TYD<BR> + TX<BR> + -<BR> + 150SX<BR> + 100SX<BR> + 102T<BR> + 101S<BR> + 190T<BR> + 150TX<BR> + 101<BR> + -<BR> + -<BR> + 101SX<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + ET6P<BR> + ET6S<BR> + ET6X<BR> + RJ-6W/8014EMW<BR> + RJ-6P/8014EMP<BR> + RJ-6X/8014EMX<BR> + TM7W<BR> + TM7P<BR> + TM7X<BR> + -<BR> + 8017SMS<BR> + -<BR> + 8017SMB<BR> + 8017SMA<BR> + -<BR> + -<BR> + CT-6W<BR> + CT-6H<BR> + CT-6P<BR> + CT-6R<BR> + -<BR> + CT-6V<BR> + CT-6X<BR> + -<BR> + -<BR> + 8038EKV<BR> + -<BR> + 8038EKX<BR> + -<BR> + -<BR> + 8038EKP<BR> + 8038EKZ<BR> + 8038EKW<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + 3321H<BR> + 3321P<BR> + 3321N<BR> + 1102H<BR> + 1102P<BR> + 1102T<BR> + RVA0911V304A<BR> + -<BR> + RVA0911H413A<BR> + RVG0707V100A<BR> + RVA0607V(H)306A<BR> + RVA1214H213A<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 3104B<BR> + 3104C<BR> + 3104F<BR> + 3104H<BR> + -<BR> + 3104M<BR> + 3104P<BR> + 3104S<BR> + 3104W<BR> + 3104X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + EVMQ0G<BR> + EVMQIG<BR> + EVMQ3G<BR> + EVMS0G<BR> + EVMQ0G<BR> + EVMG0G<BR> + -<BR> + -<BR> + -<BR> + EVMK4GA00B<BR> + EVM30GA00B<BR> + EVMK0GA00B<BR> + EVM38GA00B<BR> + EVMB6<BR> + EVLQ0<BR> + -<BR> + EVMMSG<BR> + EVMMBG<BR> + EVMMAG<BR> + -<BR> + -<BR> + EVMMCS<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + EVMM1<BR> + -<BR> + -<BR> + EVMM0<BR> + -<BR> + -<BR> + EVMM3<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + 62-3-1<BR> + 62-1-2<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 67R<BR> + -<BR> + 67P<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 67X<BR> + 63V<BR> + 63S<BR> + 63M<BR> + -<BR> + -<BR> + 63H<BR> + 63P<BR> + -<BR> + -<BR> + 63X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + RJ/RJR50<BR> + RJ/RJR50<BR> + RJ/RJR50<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + </TR> +</TABLE> +<P>&nbsp;<P> +<TABLE BORDER=0 CELLSPACING=1 CELLPADDING=3> + <TR> + <TD COLSPAN=7> + <FONT color="#0000FF" SIZE=4 FACE=ARIAL><B>SMD TRIM-POT CROSS REFERENCE</B></FONT> + <P> + <FONT SIZE=4 FACE=ARIAL><B>MULTI-TURN</B></FONT> + </TD> + </TR> + <TR> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>BOURNS</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>BI&nbsp;TECH</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>DALE-VISHAY</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>PHILIPS/MEPCO</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>PANASONIC</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>TOCOS</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>AUX/KYOCERA</B></FONT> + </TD> + </TR> + <TR> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 3224G<BR> + 3224J<BR> + 3224W<BR> + 3269P<BR> + 3269W<BR> + 3269X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 44G<BR> + 44J<BR> + 44W<BR> + 84P<BR> + 84W<BR> + 84X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + ST63Z<BR> + ST63Y<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + ST5P<BR> + ST5W<BR> + ST5X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + </TR> + <TR> + <TD COLSPAN=7>&nbsp; + </TD> + </TR> + <TR> + <TD COLSPAN=7> + <FONT SIZE=4 FACE=ARIAL><B>SINGLE TURN</B></FONT> + </TD> + </TR> + <TR> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>BOURNS</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>BI&nbsp;TECH</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>DALE-VISHAY</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>PHILIPS/MEPCO</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>PANASONIC</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>TOCOS</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>AUX/KYOCERA</B></FONT> + </TD> + </TR> + <TR> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 3314G<BR> + 3314J<BR> + 3364A/B<BR> + 3364C/D<BR> + 3364W/X<BR> + 3313G<BR> + 3313J<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 23B<BR> + 23A<BR> + 21X<BR> + 21W<BR> + -<BR> + 22B<BR> + 22A<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + ST5YL/ST53YL<BR> + ST5YJ/5T53YJ<BR> + ST-23A<BR> + ST-22B<BR> + ST-22<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + ST-4B<BR> + ST-4A<BR> + -<BR> + -<BR> + -<BR> + ST-3B<BR> + ST-3A<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + EVM-6YS<BR> + EVM-1E<BR> + EVM-1G<BR> + EVM-1D<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + G4B<BR> + G4A<BR> + TR04-3S1<BR> + TRG04-2S1<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + DVR-43A<BR> + CVR-42C<BR> + CVR-42A/C<BR> + -<BR> + -<BR></FONT> + </TD> + </TR> +</TABLE> +<P> +<FONT SIZE=4 FACE=ARIAL><B>ALT =&nbsp;ALTERNATE</B></FONT> +<P> + +&nbsp; +<P> +</td> +</tr> +</table> +</BODY></HTML> + + +<b>CAPACITOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>INDUCTOR</b><p> +chip + + + + +>NAME +>VALUE + + + + + + +<b>LEDs</b><p> +<author>Created by librarian@cadsoft.de</author><br> +Extended by Federico Battaglin <author>&lt;federico.rd@fdpinternational.com&gt;</author> with DUOLED + + +<B>LED</B><p> +3 mm, round + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + +Based on STM PCB layout recomendations. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>MOLEX KK® Series Connectors</b> - v1.01 (08/17/2010)<p> +Receptacals and Headers<p> +<p>THIS LIBRARY IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED.<br> +USE AT YOUR OWN RISK!<p> +<author>Copyright (C) 2010, Bob Starr<br> http://www.bobstarr.net<br></author> + + +<b>RECEPTACAL</b><p> +Vertical, Bottom Entry, 0.1" pitch + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + +<h3>SparkFun Electronics' preferred foot prints</h3> +In this library you'll find anything that moves- switches, relays, buttons, potentiometers. Also, anything that goes on a board but isn't electrical in nature- screws, standoffs, etc.<br><br> +We've spent an enormous amount of time creating and checking these footprints and parts, but it is the end user's responsibility to ensure correctness and suitablity for a given componet or application. If you enjoy using this library, please buy one of our products at www.sparkfun.com. +<br><br> +<b>Licensing:</b> Creative Commons ShareAlike 4.0 International - https://creativecommons.org/licenses/by-sa/4.0/ +<br><br> +You are welcome to use this library for commercial purposes. For attribution, we ask that when you begin to sell your device using our footprint, you email us with a link to the product being sold. We want bragging rights that we helped (in a very small part) to create your 8th world wonder. We would like the opportunity to feature your device on our homepage. + + +<b>OMRON SWITCH</b> + + + + + + + + + + + + + + + + + + + + + + + + +>NAME + + + + +<b>Jumpers</b><p> +<author>Created by librarian@cadsoft.de</author> + + +<b>Solder jumper</b> + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + +Developed by element14 :<br> +element14 CAD Library consolidation.ulp +at 30/07/2012 17:45:58 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +* + + + + + +* +>NAME +>VALUE + + + + +<b>Resistors, Capacitors, Inductors</b><p> +Based on the previous libraries: +<ul> +<li>r.lbr +<li>cap.lbr +<li>cap-fe.lbr +<li>captant.lbr +<li>polcap.lbr +<li>ipc-smd.lbr +</ul> +All SMD packages are defined according to the IPC specifications and CECC<p> +<author>Created by librarian@cadsoft.de</author><p> +<p> +for Electrolyt Capacitors see also :<p> +www.bccomponents.com <p> +www.panasonic.com<p> +www.kemet.com<p> +http://www.secc.co.jp/pdf/os_e/2004/e_os_all.pdf <b>(SANYO)</b> +<p> +for trimmer refence see : <u>www.electrospec-inc.com/cross_references/trimpotcrossref.asp</u><p> + +<table border=0 cellspacing=0 cellpadding=0 width="100%" cellpaddding=0> +<tr valign="top"> + +<! <td width="10">&nbsp;</td> +<td width="90%"> + +<b><font color="#0000FF" size="4">TRIM-POT CROSS REFERENCE</font></b> +<P> +<TABLE BORDER=0 CELLSPACING=1 CELLPADDING=2> + <TR> + <TD COLSPAN=8> + <FONT SIZE=3 FACE=ARIAL><B>RECTANGULAR MULTI-TURN</B></FONT> + </TD> + </TR> + <TR> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">BOURNS</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">BI&nbsp;TECH</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">DALE-VISHAY</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">PHILIPS/MEPCO</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">MURATA</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">PANASONIC</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">SPECTROL</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">MILSPEC</FONT> + </B> + </TD><TD>&nbsp;</TD> + </TR> + <TR> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3 > + 3005P<BR> + 3006P<BR> + 3006W<BR> + 3006Y<BR> + 3009P<BR> + 3009W<BR> + 3009Y<BR> + 3057J<BR> + 3057L<BR> + 3057P<BR> + 3057Y<BR> + 3059J<BR> + 3059L<BR> + 3059P<BR> + 3059Y<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + 89P<BR> + 89W<BR> + 89X<BR> + 89PH<BR> + 76P<BR> + 89XH<BR> + 78SLT<BR> + 78L&nbsp;ALT<BR> + 56P&nbsp;ALT<BR> + 78P&nbsp;ALT<BR> + T8S<BR> + 78L<BR> + 56P<BR> + 78P<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + T18/784<BR> + 783<BR> + 781<BR> + -<BR> + -<BR> + -<BR> + 2199<BR> + 1697/1897<BR> + 1680/1880<BR> + 2187<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + 8035EKP/CT20/RJ-20P<BR> + -<BR> + RJ-20X<BR> + -<BR> + -<BR> + -<BR> + 1211L<BR> + 8012EKQ&nbsp;ALT<BR> + 8012EKR&nbsp;ALT<BR> + 1211P<BR> + 8012EKJ<BR> + 8012EKL<BR> + 8012EKQ<BR> + 8012EKR<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + 2101P<BR> + 2101W<BR> + 2101Y<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 2102L<BR> + 2102S<BR> + 2102Y<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + EVMCOG<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + 43P<BR> + 43W<BR> + 43Y<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 40L<BR> + 40P<BR> + 40Y<BR> + 70Y-T602<BR> + 70L<BR> + 70P<BR> + 70Y<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + RT/RTR12<BR> + RT/RTR12<BR> + RT/RTR12<BR> + -<BR> + RJ/RJR12<BR> + RJ/RJR12<BR> + RJ/RJR12<BR></FONT> + </TD> + </TR> + <TR> + <TD COLSPAN=8>&nbsp; + </TD> + </TR> + <TR> + <TD COLSPAN=8> + <FONT SIZE=4 FACE=ARIAL><B>SQUARE MULTI-TURN</B></FONT> + </TD> + </TR> + <TR> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>BOURN</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>BI&nbsp;TECH</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>DALE-VISHAY</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>PHILIPS/MEPCO</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>MURATA</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>PANASONIC</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>SPECTROL</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>MILSPEC</B></FONT> + </TD> + </TR> + <TR> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 3250L<BR> + 3250P<BR> + 3250W<BR> + 3250X<BR> + 3252P<BR> + 3252W<BR> + 3252X<BR> + 3260P<BR> + 3260W<BR> + 3260X<BR> + 3262P<BR> + 3262W<BR> + 3262X<BR> + 3266P<BR> + 3266W<BR> + 3266X<BR> + 3290H<BR> + 3290P<BR> + 3290W<BR> + 3292P<BR> + 3292W<BR> + 3292X<BR> + 3296P<BR> + 3296W<BR> + 3296X<BR> + 3296Y<BR> + 3296Z<BR> + 3299P<BR> + 3299W<BR> + 3299X<BR> + 3299Y<BR> + 3299Z<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + 66P&nbsp;ALT<BR> + 66W&nbsp;ALT<BR> + 66X&nbsp;ALT<BR> + 66P&nbsp;ALT<BR> + 66W&nbsp;ALT<BR> + 66X&nbsp;ALT<BR> + -<BR> + 64W&nbsp;ALT<BR> + -<BR> + 64P&nbsp;ALT<BR> + 64W&nbsp;ALT<BR> + 64X&nbsp;ALT<BR> + 64P<BR> + 64W<BR> + 64X<BR> + 66X&nbsp;ALT<BR> + 66P&nbsp;ALT<BR> + 66W&nbsp;ALT<BR> + 66P<BR> + 66W<BR> + 66X<BR> + 67P<BR> + 67W<BR> + 67X<BR> + 67Y<BR> + 67Z<BR> + 68P<BR> + 68W<BR> + 68X<BR> + 67Y&nbsp;ALT<BR> + 67Z&nbsp;ALT<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 5050<BR> + 5091<BR> + 5080<BR> + 5087<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + T63YB<BR> + T63XB<BR> + -<BR> + -<BR> + -<BR> + 5887<BR> + 5891<BR> + 5880<BR> + -<BR> + -<BR> + -<BR> + T93Z<BR> + T93YA<BR> + T93XA<BR> + T93YB<BR> + T93XB<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 8026EKP<BR> + 8026EKW<BR> + 8026EKM<BR> + 8026EKP<BR> + 8026EKB<BR> + 8026EKM<BR> + 1309X<BR> + 1309P<BR> + 1309W<BR> + 8024EKP<BR> + 8024EKW<BR> + 8024EKN<BR> + RJ-9P/CT9P<BR> + RJ-9W<BR> + RJ-9X<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 3103P<BR> + 3103Y<BR> + 3103Z<BR> + 3103P<BR> + 3103Y<BR> + 3103Z<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 3105P/3106P<BR> + 3105W/3106W<BR> + 3105X/3106X<BR> + 3105Y/3106Y<BR> + 3105Z/3105Z<BR> + 3102P<BR> + 3102W<BR> + 3102X<BR> + 3102Y<BR> + 3102Z<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + EVMCBG<BR> + EVMCCG<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 55-1-X<BR> + 55-4-X<BR> + 55-3-X<BR> + 55-2-X<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 50-2-X<BR> + 50-4-X<BR> + 50-3-X<BR> + -<BR> + -<BR> + -<BR> + 64P<BR> + 64W<BR> + 64X<BR> + 64Y<BR> + 64Z<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + RT/RTR22<BR> + RT/RTR22<BR> + RT/RTR22<BR> + RT/RTR22<BR> + RJ/RJR22<BR> + RJ/RJR22<BR> + RJ/RJR22<BR> + RT/RTR26<BR> + RT/RTR26<BR> + RT/RTR26<BR> + RJ/RJR26<BR> + RJ/RJR26<BR> + RJ/RJR26<BR> + RJ/RJR26<BR> + RJ/RJR26<BR> + RJ/RJR26<BR> + RT/RTR24<BR> + RT/RTR24<BR> + RT/RTR24<BR> + RJ/RJR24<BR> + RJ/RJR24<BR> + RJ/RJR24<BR> + RJ/RJR24<BR> + RJ/RJR24<BR> + RJ/RJR24<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + </TR> + <TR> + <TD COLSPAN=8>&nbsp; + </TD> + </TR> + <TR> + <TD COLSPAN=8> + <FONT SIZE=4 FACE=ARIAL><B>SINGLE TURN</B></FONT> + </TD> + </TR> + <TR> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>BOURN</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>BI&nbsp;TECH</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>DALE-VISHAY</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>PHILIPS/MEPCO</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>MURATA</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>PANASONIC</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>SPECTROL</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>MILSPEC</B></FONT> + </TD> + </TR> + <TR> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 3323P<BR> + 3323S<BR> + 3323W<BR> + 3329H<BR> + 3329P<BR> + 3329W<BR> + 3339H<BR> + 3339P<BR> + 3339W<BR> + 3352E<BR> + 3352H<BR> + 3352K<BR> + 3352P<BR> + 3352T<BR> + 3352V<BR> + 3352W<BR> + 3362H<BR> + 3362M<BR> + 3362P<BR> + 3362R<BR> + 3362S<BR> + 3362U<BR> + 3362W<BR> + 3362X<BR> + 3386B<BR> + 3386C<BR> + 3386F<BR> + 3386H<BR> + 3386K<BR> + 3386M<BR> + 3386P<BR> + 3386S<BR> + 3386W<BR> + 3386X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 25P<BR> + 25S<BR> + 25RX<BR> + 82P<BR> + 82M<BR> + 82PA<BR> + -<BR> + -<BR> + -<BR> + 91E<BR> + 91X<BR> + 91T<BR> + 91B<BR> + 91A<BR> + 91V<BR> + 91W<BR> + 25W<BR> + 25V<BR> + 25P<BR> + -<BR> + 25S<BR> + 25U<BR> + 25RX<BR> + 25X<BR> + 72XW<BR> + 72XL<BR> + 72PM<BR> + 72RX<BR> + -<BR> + 72PX<BR> + 72P<BR> + 72RXW<BR> + 72RXL<BR> + 72X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + T7YB<BR> + T7YA<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + TXD<BR> + TYA<BR> + TYP<BR> + -<BR> + TYD<BR> + TX<BR> + -<BR> + 150SX<BR> + 100SX<BR> + 102T<BR> + 101S<BR> + 190T<BR> + 150TX<BR> + 101<BR> + -<BR> + -<BR> + 101SX<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + ET6P<BR> + ET6S<BR> + ET6X<BR> + RJ-6W/8014EMW<BR> + RJ-6P/8014EMP<BR> + RJ-6X/8014EMX<BR> + TM7W<BR> + TM7P<BR> + TM7X<BR> + -<BR> + 8017SMS<BR> + -<BR> + 8017SMB<BR> + 8017SMA<BR> + -<BR> + -<BR> + CT-6W<BR> + CT-6H<BR> + CT-6P<BR> + CT-6R<BR> + -<BR> + CT-6V<BR> + CT-6X<BR> + -<BR> + -<BR> + 8038EKV<BR> + -<BR> + 8038EKX<BR> + -<BR> + -<BR> + 8038EKP<BR> + 8038EKZ<BR> + 8038EKW<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + 3321H<BR> + 3321P<BR> + 3321N<BR> + 1102H<BR> + 1102P<BR> + 1102T<BR> + RVA0911V304A<BR> + -<BR> + RVA0911H413A<BR> + RVG0707V100A<BR> + RVA0607V(H)306A<BR> + RVA1214H213A<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 3104B<BR> + 3104C<BR> + 3104F<BR> + 3104H<BR> + -<BR> + 3104M<BR> + 3104P<BR> + 3104S<BR> + 3104W<BR> + 3104X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + EVMQ0G<BR> + EVMQIG<BR> + EVMQ3G<BR> + EVMS0G<BR> + EVMQ0G<BR> + EVMG0G<BR> + -<BR> + -<BR> + -<BR> + EVMK4GA00B<BR> + EVM30GA00B<BR> + EVMK0GA00B<BR> + EVM38GA00B<BR> + EVMB6<BR> + EVLQ0<BR> + -<BR> + EVMMSG<BR> + EVMMBG<BR> + EVMMAG<BR> + -<BR> + -<BR> + EVMMCS<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + EVMM1<BR> + -<BR> + -<BR> + EVMM0<BR> + -<BR> + -<BR> + EVMM3<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + 62-3-1<BR> + 62-1-2<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 67R<BR> + -<BR> + 67P<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 67X<BR> + 63V<BR> + 63S<BR> + 63M<BR> + -<BR> + -<BR> + 63H<BR> + 63P<BR> + -<BR> + -<BR> + 63X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + RJ/RJR50<BR> + RJ/RJR50<BR> + RJ/RJR50<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + </TR> +</TABLE> +<P>&nbsp;<P> +<TABLE BORDER=0 CELLSPACING=1 CELLPADDING=3> + <TR> + <TD COLSPAN=7> + <FONT color="#0000FF" SIZE=4 FACE=ARIAL><B>SMD TRIM-POT CROSS REFERENCE</B></FONT> + <P> + <FONT SIZE=4 FACE=ARIAL><B>MULTI-TURN</B></FONT> + </TD> + </TR> + <TR> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>BOURNS</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>BI&nbsp;TECH</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>DALE-VISHAY</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>PHILIPS/MEPCO</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>PANASONIC</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>TOCOS</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>AUX/KYOCERA</B></FONT> + </TD> + </TR> + <TR> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 3224G<BR> + 3224J<BR> + 3224W<BR> + 3269P<BR> + 3269W<BR> + 3269X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 44G<BR> + 44J<BR> + 44W<BR> + 84P<BR> + 84W<BR> + 84X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + ST63Z<BR> + ST63Y<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + ST5P<BR> + ST5W<BR> + ST5X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + </TR> + <TR> + <TD COLSPAN=7>&nbsp; + </TD> + </TR> + <TR> + <TD COLSPAN=7> + <FONT SIZE=4 FACE=ARIAL><B>SINGLE TURN</B></FONT> + </TD> + </TR> + <TR> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>BOURNS</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>BI&nbsp;TECH</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>DALE-VISHAY</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>PHILIPS/MEPCO</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>PANASONIC</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>TOCOS</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>AUX/KYOCERA</B></FONT> + </TD> + </TR> + <TR> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 3314G<BR> + 3314J<BR> + 3364A/B<BR> + 3364C/D<BR> + 3364W/X<BR> + 3313G<BR> + 3313J<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 23B<BR> + 23A<BR> + 21X<BR> + 21W<BR> + -<BR> + 22B<BR> + 22A<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + ST5YL/ST53YL<BR> + ST5YJ/5T53YJ<BR> + ST-23A<BR> + ST-22B<BR> + ST-22<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + ST-4B<BR> + ST-4A<BR> + -<BR> + -<BR> + -<BR> + ST-3B<BR> + ST-3A<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + EVM-6YS<BR> + EVM-1E<BR> + EVM-1G<BR> + EVM-1D<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + G4B<BR> + G4A<BR> + TR04-3S1<BR> + TRG04-2S1<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + DVR-43A<BR> + CVR-42C<BR> + CVR-42A/C<BR> + -<BR> + -<BR></FONT> + </TD> + </TR> +</TABLE> +<P> +<FONT SIZE=4 FACE=ARIAL><B>ALT =&nbsp;ALTERNATE</B></FONT> +<P> + +&nbsp; +<P> +</td> +</tr> +</table> + + +<b>Ceramic Chip Capacitor KEMET 1210 reflow solder</b><p> +Metric Code Size 3225 + + + + +>NAME +>VALUE + + + + + + + + +<b>DIL/CODE SWITCH</b><p> +<p> +distributor Buerklin, 17G482 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + +DIY Multi RF module library v0.3 + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + +<b>Pin Headers</b><p> +Naming:<p> +MA = male<p> +# contacts - # rows<p> +W = angled<p> +<author>Created by librarian@cadsoft.de</author> + + +<b>PIN HEADER</b> + + + + + + + + + + + + + + + + + + + + + + + +>NAME +1 +>VALUE + + + + + +<b>PIN HEADER</b> + + + + + + + + + + + + + + + + + + + + + + + + + + +1 +>NAME +6 +>VALUE + + + + + + + + +<b>PIN HEADER</b> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +1 +>VALUE +4 + + + + + + + + +<b>Diodes</b><p> +Based on the following sources: +<ul> +<li>Motorola : www.onsemi.com +<li>Fairchild : www.fairchildsemi.com +<li>Philips : www.semiconductors.com +<li>Vishay : www.vishay.de +</ul> +<author>Created by librarian@cadsoft.de</author> + + +<b>Mini Melf Diode</b> + + + + + + + +>NAME +>VALUE + + + + + + + +<h3>SparkFun Electronics' preferred foot prints</h3> +We've spent an enormous amount of time creating and checking these footprints and parts. If you enjoy using this library, please buy one of our products at www.sparkfun.com. +<br><br> +<b>Licensing:</b> CC v3.0 Share-Alike You are welcome to use this library for commercial purposes. For attribution, we ask that when you begin to sell your device using our footprint, you email us with a link to the product being sold. We want bragging rights that we helped (in a very small part) to create your 8th world wonder. We would like the opportunity to feature your device on our homepage. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<BR>Würth Elektronik -- Electronic Interconnect & Electromechanical Solutions<br><Hr> +<BR><BR> +<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0> +<TR> +<TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3><BR><br> + &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<BR> + <BR> + <BR> + <BR><BR></FONT> + </TD> +<TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3><br> + -----<BR> + -----<BR> + -----<BR> + -----<BR> + -----<BR><BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER> <FONT FACE=ARIAL SIZE=3><br> + ---------------------------<BR> +<B><I><span style='font-size:26pt; + color:#FF6600;'>WE </span></i></b> +<BR> + ---------------------------<BR><b>Würth Elektronik</b></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3><br> + ---------O---<BR> + ----O--------<BR> + ---------O---<BR> + ----O--------<BR> + ---------O---<BR><BR></FONT> + </TD> + +<TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3><BR> + &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<BR> + <BR> + <BR> + <BR> + <BR><BR></FONT> + </TD> + </TR> + + <TR> + <TD COLSPAN=7>&nbsp; + </TD> + </TR> + +</TABLE> +<B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;More than you expect<BR><BR><BR></B> + +<HR><BR> +<b>Würth Elektronik eiSos GmbH & Co. KG</b><br> +EMC & Inductive Solutions<br> + +Max-Eyth-Str.1<br> +D-74638 Waldenburg<br> +<br> +Tel: +49 (0)7942-945-0<br> +Fax:+49 (0)7942-945-405<br> +<br> +<a href="http://www.we-online.com">http://www.we-online.com</a><br> +<a href="mailto:pm.hotline@we-online.de">pm.hotline@we-online.de</a> <BR><BR> +<br><HR><BR> +Neither CadSoft nor WE-eiSos does warrant that this library is error-free or <br> +that it meets your specific requirements.<br><BR> +Please contact us for more information.<br><BR><br> +<hr> +Version 1.2, May 6-th 2011 +<HR> +Copyright: Würth Elektronik + + +WR-COM Vertical 5 Contacts Mini USB Type B, 5 pins + + + + + + + + + + + + + + + +1 +5 +>NAME +>VALUE + + + + + + + + + + + + + + + +<b>HAKA Design-Regeln für Standardleiterplatten (Stand 29.07.2009):</b><br> +<br> +Diese DRU-Datei enthält alle erforderlichen Design Einstellungen, damit Ihre Leiterplatten bei uns fehlerfrei und kostengünstig produziert werden können. Die Optionen Shapes und Misc sind nicht relevant und der minimale Wert für Roundness Shapes sollte auf 0 gesetzt werden. <br> +<br> +Übersicht der <b> HAKA </b> Regeln:<br> +<br> +<b>allgemein:</b> +<P> +minimale Leiterbahnbreite/-abstand: 0.15 mm<br> +Strichstärke für Kupferschrift sollte mind. 0.15 mm sein um gut lesbar zu bleiben<br> +kleinster Bohrdurchmesser: 0.3 mm --> kleinstes Lötauge 0.6mm<br> +<br> +<b>Restringe um DK-Bohrungen:</b><br> +Aussenlagen: 0.15 mm<br> +<br> +Polygon-Isolierungen: 0.15 mm<br> +<br> +<font color="red"><b>Achtung:</b></font><br> +Verwenden Sie bitte nur den Vektor-Font, da nur dieser bei der Gerber-Ausgabe generiert werden kann, andere Schriftarten können zu Fehlern führen!<br> +Die Linienstärke für Polygone sollte größer sein als 0.1mm. Es entstehen ansonsten extrem große Datenmengen, weil Eagle die Polygone mit der angegebenen Strichstärke füllt. <br> +<br> +<b> Fräskonturen:</b><br> + werden im Dimension-Layer die Fräswege mit einem 2mm Werkzeug gezeichnet, so können diese Daten direkt als Fräsprogramm übernommen, und so die Leiterplatten kostenfrei mit jeder Kontur gefräst werden!<br> +Der Abstand vom Kupfer zur Kontur muß mindestens 0.2mm betragen!<br> +<br> +weitere Informationen finden Sie unter <b> <font color="blue"> www.haka-lp.de </b></font> oder bei: <br><b><font color="blue">HAKA Elektronik-Leiterplatten GmbH - Am Zankwald 12 - 66583 Spiesen-Elversberg - Tel.: 06821/730893</b></font><br><br> +einfach bestellen unter:: <br><br><b><font color="blue">www.online-Leiterplatten.de</b></font> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Since Version 6.2.2 text objects can contain more than one line, +which will not be processed correctly with this version. + + + diff --git a/STM32 PCB/V1.1/Multiprotocol_STM32_MB_1.1_t.sch b/STM32 PCB/V1.1/Multiprotocol_STM32_MB_1.1_t.sch new file mode 100644 index 0000000..fbef71d --- /dev/null +++ b/STM32 PCB/V1.1/Multiprotocol_STM32_MB_1.1_t.sch @@ -0,0 +1,17649 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>DRAWING_NAME +>LAST_DATE_TIME +>SHEET +Sheet: + + + + + +<b>FRAME</b><p> +DIN A4, landscape with location and doc. field + + + + + + + + + + + + + + +<h3>SparkFun Electronics' preferred foot prints</h3> +In this library you'll find crystals and oscillators and other things that go "tick".<br><br> +We've spent an enormous amount of time creating and checking these footprints and parts, but it is the end user's responsibility to ensure correctness and suitablity for a given componet or application. If you enjoy using this library, please buy one of our products at www.sparkfun.com. +<br><br> +<b>Licensing:</b> CC v3.0 Share-Alike You are welcome to use this library for commercial purposes. For attribution, we ask that when you begin to sell your device using our footprint, you email us with a link to the product being sold. We want bragging rights that we helped (in a very small part) to create your 8th world wonder. We would like the opportunity to feature your device on our homepage. + + + + + + + + + + + +>Name +>Value + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + +<b>Resonator</b> +Small SMD resonator. This is the itty bitty 10/20MHz resonators with built in caps. CSTCE10M0G55 and CSTCE20M0V53. Footprint has been reviewed closely but hasn't been tested yet. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<b>Supply Symbols</b><p> + GND, VCC, 0V, +5V, -5V, etc.<p> + Please keep in mind, that these devices are necessary for the + automatic wiring of the supply signals.<p> + The pin name defined in the symbol is identical to the net which is to be wired automatically.<p> + In this library the device names are the same as the pin names of the symbols, therefore the correct signal names appear next to the supply symbols in the schematic.<p> + <author>Created by librarian@cadsoft.de</author> + + + + + + +>VALUE + + + + + +>VALUE + + + + + + + +>VALUE + + + + +>VALUE + + + + + +<b>SUPPLY SYMBOL</b> + + + + + + + + + + + + +<b>SUPPLY SYMBOL</b> + + + + + + + + + + + + +<b>SUPPLY SYMBOL</b> + + + + + + + + + + + + +<b>SUPPLY SYMBOL</b> + + + + + + + + + + + + + + +<h3>SparkFun Electronics' preferred foot prints</h3> +In this library you'll find drivers, regulators, and amplifiers.<br><br> +We've spent an enormous amount of time creating and checking these footprints and parts, but it is the end user's responsibility to ensure correctness and suitablity for a given componet or application. If you enjoy using this library, please buy one of our products at www.sparkfun.com. +<br><br> +<b>Licensing:</b> Creative Commons ShareAlike 4.0 International - https://creativecommons.org/licenses/by-sa/4.0/ +<br><br> +You are welcome to use this library for commercial purposes. For attribution, we ask that when you begin to sell your device using our footprint, you email us with a link to the product being sold. We want bragging rights that we helped (in a very small part) to create your 8th world wonder. We would like the opportunity to feature your device on our homepage. + + +<b>SOT-223</b> + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + +>NAME +>VALUE +ADJ +IN +OUT + + + + + + + + +<b>Voltage Regulator LM1117</b> +Standard adjustable voltage regulator but in SMD form. Spark Fun Electronics SKU : COM-00595 + + + + + + + + + + + + + + + + + + + + +<b>Resistors, Capacitors, Inductors</b><p> +Based on the previous libraries: +<ul> +<li>r.lbr +<li>cap.lbr +<li>cap-fe.lbr +<li>captant.lbr +<li>polcap.lbr +<li>ipc-smd.lbr +</ul> +All SMD packages are defined according to the IPC specifications and CECC<p> +<author>Created by librarian@cadsoft.de</author><p> +<p> +for Electrolyt Capacitors see also :<p> +www.bccomponents.com <p> +www.panasonic.com<p> +www.kemet.com<p> +<p> +for trimmer refence see : <u>www.electrospec-inc.com/cross_references/trimpotcrossref.asp</u><p> + +<map name="nav_main"> +<area shape="rect" coords="0,1,140,23" href="../military_specs.asp" title=""> +<area shape="rect" coords="0,24,140,51" href="../about.asp" title=""> +<area shape="rect" coords="1,52,140,77" href="../rfq.asp" title=""> +<area shape="rect" coords="0,78,139,103" href="../products.asp" title=""> +<area shape="rect" coords="1,102,138,128" href="../excess_inventory.asp" title=""> +<area shape="rect" coords="1,129,138,150" href="../edge.asp" title=""> +<area shape="rect" coords="1,151,139,178" href="../industry_links.asp" title=""> +<area shape="rect" coords="0,179,139,201" href="../comments.asp" title=""> +<area shape="rect" coords="1,203,138,231" href="../directory.asp" title=""> +<area shape="default" nohref> +</map> + +<html> + +<title></title> + + <LINK REL="StyleSheet" TYPE="text/css" HREF="style-sheet.css"> + +<body bgcolor="#ffffff" text="#000000" marginwidth="0" marginheight="0" topmargin="0" leftmargin="0"> +<table border=0 cellspacing=0 cellpadding=0 width="100%" cellpaddding=0 height="55%"> +<tr valign="top"> + +</td> +<! <td width="10">&nbsp;</td> +<td width="90%"> + +<b><font color="#0000FF" size="4">TRIM-POT CROSS REFERENCE</font></b> +<P> +<TABLE BORDER=0 CELLSPACING=1 CELLPADDING=2> + <TR> + <TD COLSPAN=8> + <FONT SIZE=3 FACE=ARIAL><B>RECTANGULAR MULTI-TURN</B></FONT> + </TD> + </TR> + <TR> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">BOURNS</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">BI&nbsp;TECH</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">DALE-VISHAY</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">PHILIPS/MEPCO</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">MURATA</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">PANASONIC</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">SPECTROL</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">MILSPEC</FONT> + </B> + </TD><TD>&nbsp;</TD> + </TR> + <TR> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3 > + 3005P<BR> + 3006P<BR> + 3006W<BR> + 3006Y<BR> + 3009P<BR> + 3009W<BR> + 3009Y<BR> + 3057J<BR> + 3057L<BR> + 3057P<BR> + 3057Y<BR> + 3059J<BR> + 3059L<BR> + 3059P<BR> + 3059Y<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + 89P<BR> + 89W<BR> + 89X<BR> + 89PH<BR> + 76P<BR> + 89XH<BR> + 78SLT<BR> + 78L&nbsp;ALT<BR> + 56P&nbsp;ALT<BR> + 78P&nbsp;ALT<BR> + T8S<BR> + 78L<BR> + 56P<BR> + 78P<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + T18/784<BR> + 783<BR> + 781<BR> + -<BR> + -<BR> + -<BR> + 2199<BR> + 1697/1897<BR> + 1680/1880<BR> + 2187<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + 8035EKP/CT20/RJ-20P<BR> + -<BR> + RJ-20X<BR> + -<BR> + -<BR> + -<BR> + 1211L<BR> + 8012EKQ&nbsp;ALT<BR> + 8012EKR&nbsp;ALT<BR> + 1211P<BR> + 8012EKJ<BR> + 8012EKL<BR> + 8012EKQ<BR> + 8012EKR<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + 2101P<BR> + 2101W<BR> + 2101Y<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 2102L<BR> + 2102S<BR> + 2102Y<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + EVMCOG<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + 43P<BR> + 43W<BR> + 43Y<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 40L<BR> + 40P<BR> + 40Y<BR> + 70Y-T602<BR> + 70L<BR> + 70P<BR> + 70Y<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + RT/RTR12<BR> + RT/RTR12<BR> + RT/RTR12<BR> + -<BR> + RJ/RJR12<BR> + RJ/RJR12<BR> + RJ/RJR12<BR></FONT> + </TD> + </TR> + <TR> + <TD COLSPAN=8>&nbsp; + </TD> + </TR> + <TR> + <TD COLSPAN=8> + <FONT SIZE=4 FACE=ARIAL><B>SQUARE MULTI-TURN</B></FONT> + </TD> + </TR> + <TR> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>BOURN</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>BI&nbsp;TECH</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>DALE-VISHAY</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>PHILIPS/MEPCO</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>MURATA</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>PANASONIC</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>SPECTROL</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>MILSPEC</B></FONT> + </TD> + </TR> + <TR> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 3250L<BR> + 3250P<BR> + 3250W<BR> + 3250X<BR> + 3252P<BR> + 3252W<BR> + 3252X<BR> + 3260P<BR> + 3260W<BR> + 3260X<BR> + 3262P<BR> + 3262W<BR> + 3262X<BR> + 3266P<BR> + 3266W<BR> + 3266X<BR> + 3290H<BR> + 3290P<BR> + 3290W<BR> + 3292P<BR> + 3292W<BR> + 3292X<BR> + 3296P<BR> + 3296W<BR> + 3296X<BR> + 3296Y<BR> + 3296Z<BR> + 3299P<BR> + 3299W<BR> + 3299X<BR> + 3299Y<BR> + 3299Z<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + 66P&nbsp;ALT<BR> + 66W&nbsp;ALT<BR> + 66X&nbsp;ALT<BR> + 66P&nbsp;ALT<BR> + 66W&nbsp;ALT<BR> + 66X&nbsp;ALT<BR> + -<BR> + 64W&nbsp;ALT<BR> + -<BR> + 64P&nbsp;ALT<BR> + 64W&nbsp;ALT<BR> + 64X&nbsp;ALT<BR> + 64P<BR> + 64W<BR> + 64X<BR> + 66X&nbsp;ALT<BR> + 66P&nbsp;ALT<BR> + 66W&nbsp;ALT<BR> + 66P<BR> + 66W<BR> + 66X<BR> + 67P<BR> + 67W<BR> + 67X<BR> + 67Y<BR> + 67Z<BR> + 68P<BR> + 68W<BR> + 68X<BR> + 67Y&nbsp;ALT<BR> + 67Z&nbsp;ALT<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 5050<BR> + 5091<BR> + 5080<BR> + 5087<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + T63YB<BR> + T63XB<BR> + -<BR> + -<BR> + -<BR> + 5887<BR> + 5891<BR> + 5880<BR> + -<BR> + -<BR> + -<BR> + T93Z<BR> + T93YA<BR> + T93XA<BR> + T93YB<BR> + T93XB<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 8026EKP<BR> + 8026EKW<BR> + 8026EKM<BR> + 8026EKP<BR> + 8026EKB<BR> + 8026EKM<BR> + 1309X<BR> + 1309P<BR> + 1309W<BR> + 8024EKP<BR> + 8024EKW<BR> + 8024EKN<BR> + RJ-9P/CT9P<BR> + RJ-9W<BR> + RJ-9X<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 3103P<BR> + 3103Y<BR> + 3103Z<BR> + 3103P<BR> + 3103Y<BR> + 3103Z<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 3105P/3106P<BR> + 3105W/3106W<BR> + 3105X/3106X<BR> + 3105Y/3106Y<BR> + 3105Z/3105Z<BR> + 3102P<BR> + 3102W<BR> + 3102X<BR> + 3102Y<BR> + 3102Z<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + EVMCBG<BR> + EVMCCG<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 55-1-X<BR> + 55-4-X<BR> + 55-3-X<BR> + 55-2-X<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 50-2-X<BR> + 50-4-X<BR> + 50-3-X<BR> + -<BR> + -<BR> + -<BR> + 64P<BR> + 64W<BR> + 64X<BR> + 64Y<BR> + 64Z<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + RT/RTR22<BR> + RT/RTR22<BR> + RT/RTR22<BR> + RT/RTR22<BR> + RJ/RJR22<BR> + RJ/RJR22<BR> + RJ/RJR22<BR> + RT/RTR26<BR> + RT/RTR26<BR> + RT/RTR26<BR> + RJ/RJR26<BR> + RJ/RJR26<BR> + RJ/RJR26<BR> + RJ/RJR26<BR> + RJ/RJR26<BR> + RJ/RJR26<BR> + RT/RTR24<BR> + RT/RTR24<BR> + RT/RTR24<BR> + RJ/RJR24<BR> + RJ/RJR24<BR> + RJ/RJR24<BR> + RJ/RJR24<BR> + RJ/RJR24<BR> + RJ/RJR24<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + </TR> + <TR> + <TD COLSPAN=8>&nbsp; + </TD> + </TR> + <TR> + <TD COLSPAN=8> + <FONT SIZE=4 FACE=ARIAL><B>SINGLE TURN</B></FONT> + </TD> + </TR> + <TR> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>BOURN</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>BI&nbsp;TECH</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>DALE-VISHAY</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>PHILIPS/MEPCO</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>MURATA</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>PANASONIC</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>SPECTROL</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>MILSPEC</B></FONT> + </TD> + </TR> + <TR> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 3323P<BR> + 3323S<BR> + 3323W<BR> + 3329H<BR> + 3329P<BR> + 3329W<BR> + 3339H<BR> + 3339P<BR> + 3339W<BR> + 3352E<BR> + 3352H<BR> + 3352K<BR> + 3352P<BR> + 3352T<BR> + 3352V<BR> + 3352W<BR> + 3362H<BR> + 3362M<BR> + 3362P<BR> + 3362R<BR> + 3362S<BR> + 3362U<BR> + 3362W<BR> + 3362X<BR> + 3386B<BR> + 3386C<BR> + 3386F<BR> + 3386H<BR> + 3386K<BR> + 3386M<BR> + 3386P<BR> + 3386S<BR> + 3386W<BR> + 3386X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 25P<BR> + 25S<BR> + 25RX<BR> + 82P<BR> + 82M<BR> + 82PA<BR> + -<BR> + -<BR> + -<BR> + 91E<BR> + 91X<BR> + 91T<BR> + 91B<BR> + 91A<BR> + 91V<BR> + 91W<BR> + 25W<BR> + 25V<BR> + 25P<BR> + -<BR> + 25S<BR> + 25U<BR> + 25RX<BR> + 25X<BR> + 72XW<BR> + 72XL<BR> + 72PM<BR> + 72RX<BR> + -<BR> + 72PX<BR> + 72P<BR> + 72RXW<BR> + 72RXL<BR> + 72X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + T7YB<BR> + T7YA<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + TXD<BR> + TYA<BR> + TYP<BR> + -<BR> + TYD<BR> + TX<BR> + -<BR> + 150SX<BR> + 100SX<BR> + 102T<BR> + 101S<BR> + 190T<BR> + 150TX<BR> + 101<BR> + -<BR> + -<BR> + 101SX<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + ET6P<BR> + ET6S<BR> + ET6X<BR> + RJ-6W/8014EMW<BR> + RJ-6P/8014EMP<BR> + RJ-6X/8014EMX<BR> + TM7W<BR> + TM7P<BR> + TM7X<BR> + -<BR> + 8017SMS<BR> + -<BR> + 8017SMB<BR> + 8017SMA<BR> + -<BR> + -<BR> + CT-6W<BR> + CT-6H<BR> + CT-6P<BR> + CT-6R<BR> + -<BR> + CT-6V<BR> + CT-6X<BR> + -<BR> + -<BR> + 8038EKV<BR> + -<BR> + 8038EKX<BR> + -<BR> + -<BR> + 8038EKP<BR> + 8038EKZ<BR> + 8038EKW<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + 3321H<BR> + 3321P<BR> + 3321N<BR> + 1102H<BR> + 1102P<BR> + 1102T<BR> + RVA0911V304A<BR> + -<BR> + RVA0911H413A<BR> + RVG0707V100A<BR> + RVA0607V(H)306A<BR> + RVA1214H213A<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 3104B<BR> + 3104C<BR> + 3104F<BR> + 3104H<BR> + -<BR> + 3104M<BR> + 3104P<BR> + 3104S<BR> + 3104W<BR> + 3104X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + EVMQ0G<BR> + EVMQIG<BR> + EVMQ3G<BR> + EVMS0G<BR> + EVMQ0G<BR> + EVMG0G<BR> + -<BR> + -<BR> + -<BR> + EVMK4GA00B<BR> + EVM30GA00B<BR> + EVMK0GA00B<BR> + EVM38GA00B<BR> + EVMB6<BR> + EVLQ0<BR> + -<BR> + EVMMSG<BR> + EVMMBG<BR> + EVMMAG<BR> + -<BR> + -<BR> + EVMMCS<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + EVMM1<BR> + -<BR> + -<BR> + EVMM0<BR> + -<BR> + -<BR> + EVMM3<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + 62-3-1<BR> + 62-1-2<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 67R<BR> + -<BR> + 67P<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 67X<BR> + 63V<BR> + 63S<BR> + 63M<BR> + -<BR> + -<BR> + 63H<BR> + 63P<BR> + -<BR> + -<BR> + 63X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + RJ/RJR50<BR> + RJ/RJR50<BR> + RJ/RJR50<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + </TR> +</TABLE> +<P>&nbsp;<P> +<TABLE BORDER=0 CELLSPACING=1 CELLPADDING=3> + <TR> + <TD COLSPAN=7> + <FONT color="#0000FF" SIZE=4 FACE=ARIAL><B>SMD TRIM-POT CROSS REFERENCE</B></FONT> + <P> + <FONT SIZE=4 FACE=ARIAL><B>MULTI-TURN</B></FONT> + </TD> + </TR> + <TR> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>BOURNS</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>BI&nbsp;TECH</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>DALE-VISHAY</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>PHILIPS/MEPCO</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>PANASONIC</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>TOCOS</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>AUX/KYOCERA</B></FONT> + </TD> + </TR> + <TR> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 3224G<BR> + 3224J<BR> + 3224W<BR> + 3269P<BR> + 3269W<BR> + 3269X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 44G<BR> + 44J<BR> + 44W<BR> + 84P<BR> + 84W<BR> + 84X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + ST63Z<BR> + ST63Y<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + ST5P<BR> + ST5W<BR> + ST5X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + </TR> + <TR> + <TD COLSPAN=7>&nbsp; + </TD> + </TR> + <TR> + <TD COLSPAN=7> + <FONT SIZE=4 FACE=ARIAL><B>SINGLE TURN</B></FONT> + </TD> + </TR> + <TR> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>BOURNS</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>BI&nbsp;TECH</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>DALE-VISHAY</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>PHILIPS/MEPCO</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>PANASONIC</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>TOCOS</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>AUX/KYOCERA</B></FONT> + </TD> + </TR> + <TR> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 3314G<BR> + 3314J<BR> + 3364A/B<BR> + 3364C/D<BR> + 3364W/X<BR> + 3313G<BR> + 3313J<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 23B<BR> + 23A<BR> + 21X<BR> + 21W<BR> + -<BR> + 22B<BR> + 22A<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + ST5YL/ST53YL<BR> + ST5YJ/5T53YJ<BR> + ST-23A<BR> + ST-22B<BR> + ST-22<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + ST-4B<BR> + ST-4A<BR> + -<BR> + -<BR> + -<BR> + ST-3B<BR> + ST-3A<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + EVM-6YS<BR> + EVM-1E<BR> + EVM-1G<BR> + EVM-1D<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + G4B<BR> + G4A<BR> + TR04-3S1<BR> + TRG04-2S1<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + DVR-43A<BR> + CVR-42C<BR> + CVR-42A/C<BR> + -<BR> + -<BR></FONT> + </TD> + </TR> +</TABLE> +<P> +<FONT SIZE=4 FACE=ARIAL><B>ALT =&nbsp;ALTERNATE</B></FONT> +<P> + +&nbsp; +<P> +</td> +</tr> +</table> +</BODY></HTML> + + +<b>CAPACITOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b><p> +grid 2.5 mm, outline 2.4 x 4.4 mm + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 2.5 mm, outline 2.5 x 5 mm + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 2.5 mm, outline 3 x 5 mm + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 2.5 mm, outline 4 x 5 mm + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 2.5 mm, outline 5 x 5 mm + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 2.5 mm, outline 6 x 5 mm + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 2.5 mm + 5 mm, outline 2.4 x 7 mm + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 2.5 + 5 mm, outline 2.5 x 7.5 mm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 2.5 + 5 mm, outline 3.5 x 7.5 mm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 2.5 + 5 mm, outline 4.5 x 7.5 mm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 2.5 + 5 mm, outline 5.5 x 7.5 mm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 5 mm, outline 2.4 x 4.4 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>CAPACITOR</b><p> +grid 5 mm, outline 2.5 x 7.5 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 5 mm, outline 4.5 x 7.5 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 5 mm, outline 3 x 7.5 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 5 mm, outline 5 x 7.5 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 5 mm, outline 5.5 x 7.5 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 5 mm, outline 7.5 x 7.5 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +Horizontal, grid 5 mm, outline 7.5 x 7.5 mm + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>CAPACITOR</b><p> +grid 7.5 mm, outline 3.2 x 10.3 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 7.5 mm, outline 4.2 x 10.3 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 7.5 mm, outline 5.2 x 10.6 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 10.2 mm, outline 4.3 x 13.3 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 10.2 mm, outline 5.4 x 13.3 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 10.2 mm, outline 6.4 x 13.3 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 10.2 mm + 15.2 mm, outline 6.2 x 18.4 mm + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 15 mm, outline 5.4 x 18.3 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 15 mm, outline 6.4 x 18.3 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 15 mm, outline 7.2 x 18.3 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 15 mm, outline 8.4 x 18.3 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 15 mm, outline 9.1 x 18.2 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 22.5 mm, outline 6.2 x 26.8 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 22.5 mm, outline 7.4 x 26.8 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 22.5 mm, outline 8.7 x 26.8 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 22.5 mm, outline 10.8 x 26.8 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 22.5 mm, outline 11.3 x 26.8 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 27.5 mm, outline 9.3 x 31.6 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 27.5 mm, outline 11.3 x 31.6 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 27.5 mm, outline 13.4 x 31.6 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 27.5 mm, outline 20.5 x 31.6 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 32.5 mm, outline 13.7 x 37.4 mm + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 32.5 mm, outline 16.2 x 37.4 mm + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 32.5 mm, outline 18.2 x 37.4 mm + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 37.5 mm, outline 19.2 x 41.8 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 37.5 mm, outline 20.3 x 41.8 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 5 mm, outline 3.5 x 7.5 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 37.5 mm, outline 15.5 x 41.8 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 7.5 mm, outline 6.3 x 10.6 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 27.5 mm, outline 15.4 x 31.6 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 27.5 mm, outline 17.3 x 31.6 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>Ceramic Chip Capacitor KEMET 0204 Reflow solder</b><p> +Metric Code Size 1005 + + + + +>NAME +>VALUE + + + + +<b>Ceramic Chip Capacitor KEMET 0603 Reflow solder</b><p> +Metric Code Size 1608 + + + + +>NAME +>VALUE + + + + +<b>Ceramic Chip Capacitor KEMET 0805 Reflow solder</b><p> +Metric Code Size 2012 + + + + +>NAME +>VALUE + + + + +<b>Ceramic Chip Capacitor KEMET 1206 Reflow solder</b><p> +Metric Code Size 3216 + + + + +>NAME +>VALUE + + + + +<b>Ceramic Chip Capacitor KEMET 1210 Reflow solder</b><p> +Metric Code Size 3225 + + + + +>NAME +>VALUE + + + + +<b>Ceramic Chip Capacitor KEMET 1812 Reflow solder</b><p> +Metric Code Size 4532 + + + + +>NAME +>VALUE + + + + +<b>Ceramic Chip Capacitor KEMET 1825 Reflow solder</b><p> +Metric Code Size 4564 + + + + +>NAME +>VALUE + + + + +<b>Ceramic Chip Capacitor KEMET 2220 Reflow solder</b><p> +Metric Code Size 5650 + + + + +>NAME +>VALUE + + + + +<b>Ceramic Chip Capacitor KEMET 2225 Reflow solder</b><p> +Metric Code Size 5664 + + + + +>NAME +>VALUE + + + + +<b>RESISTOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +chip, wave soldering + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +chip, wave soldering + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +chip, wave soldering + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +chip + + + + + + + + + + +>NAME +>VALUE + + + + +<b>RESISTOR</b><p> +chip, wave soldering + + + + + + + + +>NAME +>VALUE + + + + +<b>RESISTOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +chip, wave soldering + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +chip + + + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +chip, wave soldering + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +chip, wave soldering + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +chip, wave soldering + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +chip + + + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +chip, wave soldering + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +chip + + + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +chip, wave soldering + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +MELF 0.10 W + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +MELF 0.25 W + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +MELF 0.12 W + + + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +MELF 0.10 W + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +MELF 0.25 W + + + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +MELF 0.25 W + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +MELF 0.12 W + + + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +MELF 0.25 W + + + + + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +type 0204, grid 5 mm + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>RESISTOR</b><p> +type 0204, grid 7.5 mm + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>RESISTOR</b><p> +type 0204, grid 2.5 mm + + + + + + +>NAME +>VALUE + + +<b>RESISTOR</b><p> +type 0207, grid 10 mm + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>RESISTOR</b><p> +type 0207, grid 12 mm + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + +<b>RESISTOR</b><p> +type 0207, grid 15mm + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + +<b>RESISTOR</b><p> +type 0207, grid 2.5 mm + + + + + + + +>NAME +>VALUE + + +<b>RESISTOR</b><p> +type 0207, grid 5 mm + + + + + + + +>NAME +>VALUE + + +<b>RESISTOR</b><p> +type 0207, grid 7.5 mm + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>RESISTOR</b><p> +type 0309, grid 10mm + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>RESISTOR</b><p> +type 0309, grid 12.5 mm + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>RESISTOR</b><p> +type 0309, grid 2.5 mm + + + + + + +>NAME +>VALUE + + + + + +<b>RESISTOR</b><p> +type 0411, grid 12.5 mm + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>RESISTOR</b><p> +type 0411, grid 15 mm + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>RESISTOR</b><p> +type 0411, grid 3.81 mm + + + + + + +>NAME +>VALUE + + + +<b>RESISTOR</b><p> +type 0414, grid 15 mm + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>RESISTOR</b><p> +type 0414, grid 5 mm + + + + + + +>NAME +>VALUE + + + +<b>RESISTOR</b><p> +type 0617, grid 17.5 mm + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>RESISTOR</b><p> +type 0617, grid 22.5 mm + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>RESISTOR</b><p> +type 0617, grid 5 mm + + + + + + +>NAME +>VALUE + + + +<b>RESISTOR</b><p> +type 0922, grid 22.5 mm + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + +<b>RESISTOR</b><p> +type 0613, grid 5 mm + + + + + + +>NAME +>VALUE + + + +<b>RESISTOR</b><p> +type 0613, grid 15 mm + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>RESISTOR</b><p> +type 0817, grid 22.5 mm + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE +0817 + + + + +<b>RESISTOR</b><p> +type 0817, grid 6.35 mm + + + + + + +>NAME +>VALUE +0817 + + + +<b>RESISTOR</b><p> +type V234, grid 12.5 mm + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>RESISTOR</b><p> +type V235, grid 17.78 mm + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>RESISTOR</b><p> +type V526-0, grid 2.5 mm + + + + + + + + + + +>NAME +>VALUE + + +<b>CECC Size RC2211</b> Reflow Soldering<p> +source Beyschlag + + + + + + +>NAME +>VALUE + + +<b>CECC Size RC2211</b> Wave Soldering<p> +source Beyschlag + + + + + + +>NAME +>VALUE + + +<b>CECC Size RC3715</b> Reflow Soldering<p> +source Beyschlag + + + + + + +>NAME +>VALUE + + +<b>CECC Size RC3715</b> Wave Soldering<p> +source Beyschlag + + + + + + +>NAME +>VALUE + + +<b>CECC Size RC6123</b> Reflow Soldering<p> +source Beyschlag + + + + + + +>NAME +>VALUE + + +<b>CECC Size RC6123</b> Wave Soldering<p> +source Beyschlag + + + + + + +>NAME +>VALUE + + +<b>RESISTOR</b><p> +type 0922, grid 7.5 mm + + + + + + +>NAME +>VALUE +0922 + + + +<b>RESISTOR</b><p> +type RDH, grid 15 mm + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE +RDH + + + + +<b>Mini MELF 0102 Axial</b> + + + + +>NAME +>VALUE + + + +<b>INDUCTOR</b><p> +chip + + + + + + + + +>NAME +>VALUE + + + + + +<b>INDUCTOR</b><p> +precision wire wound + + + + + + + + + + + +>NAME +>VALUE + + + + + +<b>INDUCTOR</b><p> +chip + + + + + + + + + + +>NAME +>VALUE + + + + + +<b>INDUCTOR</b><p> +molded + + + + + + + + + + + + +>NAME +>VALUE + + + +<b>INDUCTOR</b><p> +precision wire wound + + + + + + + + + + + + + +>NAME +>VALUE + + + +<b>INDUCTOR</b><p> +molded + + + + + + + + + + + + +>NAME +>VALUE + + + +<b>INDUCTOR</b><p> +molded + + + + + + + + + + + + +>NAME +>VALUE + + + +<b>INDUCTOR</b><p> +chip + + + + + + + + + + +>NAME +>VALUE + + + + + +<b>INDUCTOR</b><p> +molded + + + + + + + + + + + + +>NAME +>VALUE + + + +<b>INDUCTOR</b><p> +precision wire wound + + + + + + + + + + + + + + + +>NAME +>VALUE + + + +<b>INDUCTOR</b> <p> +precision wire wound + + + + + + + + + + + + + + + +>NAME +>VALUE + + + +<b>INDUCTOR</b> <p> +molded + + + + + + + + + + + + +>NAME +>VALUE + + + +<b>INDUCTOR</b> <p> +molded + + + + + + + + + + + + +>NAME +>VALUE + + + +<b>INDUCTOR</b><p> +chip + + + + +>NAME +>VALUE + + + + +<b>Inductor</b><p> +Source: TJ-Serie Vishay.pdf + + + + + + + + + + +>NAME +>VALUE + + +<b>Inductor</b><p> +Source: TJ-Serie Vishay.pdf + + + +>NAME +>VALUE + + +<b>Inductor</b><p> +Source: TJ-Serie Vishay.pdf + + + + + + +>NAME +>VALUE + + +<b>Inductor</b><p> +Source: TJ-Serie Vishay.pdf + + + +>NAME +>VALUE + + +<b>Inductor</b><p> +Source: TJ-Serie Vishay.pdf + + + + + + +>NAME +>VALUE + + +<b>Inductor</b><p> +Source: TJ-Serie Vishay.pdf + + + +>NAME +>VALUE + + +<b>Inductor</b><p> +Source: TJ-Serie Vishay.pdf + + + + + + +>NAME +>VALUE + + +<b>Inductor</b><p> +Source: TJ-Serie Vishay.pdf + + + +>NAME +>VALUE + + +<b>Inductor</b><p> +Source: TJ-Serie Vishay.pdf + + + + + + +>NAME +>VALUE + + +<b>Inductor</b><p> +Source: TJ-Serie Vishay.pdf + + + +>NAME +>VALUE + + +<b>Inductor</b><p> +Source: TJ-Serie Vishay.pdf + + + + + + +>NAME +>VALUE + + +<b>Inductor</b><p> +Source: TJ-Serie Vishay.pdf + + + +>NAME +>VALUE + + +<b>Inductor</b><p> +Source: TJ-Serie Vishay.pdf + + + + + + +>NAME +>VALUE + + +<b>Inductor</b><p> +Source: TJ-Serie Vishay.pdf + + + +>NAME +>VALUE + + +<b>POWER-CHOKE WE-TPC</b><p> +Würth Elektronik, Partnumber: 744053220<br> +Source: WE-TPC 744053220.pdf + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>newport components</b> 2200 Serie RM 12.7 mm<p> +Miniatur Axial Lead Inductors<br> +Source: www.rsonline.de<br> +Order code 240-517 + + + + + + + + +>NAME +>VALUE + + +<b>newport components</b> 2200 Serie RM 15.24 mm<p> +Miniatur Axial Lead Inductors<br> +Source: www.rsonline.de<br> +Order code 240-517 + + + + + + + + +>NAME +>VALUE + + +<b>newport components</b> 2200 Serie RM 11.43 mm<p> +Miniatur Axial Lead Inductors<br> +Source: www.rsonline.de<br> +Order code 240-517 + + + + + + + + +>NAME +>VALUE + + +<b>POWER INDUCTORS</b> (SMT Type)<p> +Source: www.sumida.com/products/pdf/CEP125.pdf + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + +>NAME +>VALUE + + + + + + + + + + +>NAME +>VALUE + + + + +>NAME +>VALUE + + + + + + + +<B>CAPACITOR</B>, European symbol + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<B>RESISTOR</B>, European symbol + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<B>INDUCTOR</B>, European symbol + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<b>LEDs</b><p> +<author>Created by librarian@cadsoft.de</author><br> +Extended by Federico Battaglin <author>&lt;federico.rd@fdpinternational.com&gt;</author> with DUOLED + + +<b>CHICAGO MINIATURE LAMP, INC.</b><p> +7022X Series SMT LEDs 1206 Package Size + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + +<B>LED</B><p> +5 mm, square, Siemens + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<B>LED</B><p> +2 x 5 mm, rectangle + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + +<B>LED</B><p> +3 mm, round + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<B>LED</B><p> +5 mm, round + + + + + + + + + + + +>NAME +>VALUE + + +<B>LED</B><p> +1 mm, round, Siemens + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<B>LED BLOCK</B><p> +1 LED, Siemens + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>LED HOLDER</b><p> +Siemens + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>LED HOLDER</b><p> +Siemens + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>LED HOLDER</b><p> +Siemens + + + + + + + + + + + + + + + + + +A+ +K- +>NAME +>VALUE + + + + + +<b>LED HOLDER</b><p> +Siemens + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE ++ +- + + +<B>IR LED</B><p> +infrared emitting diode, Infineon +TO-18, lead spacing 2.54 mm, cathode marking<p> +Inifineon + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<B>IR LED</B><p> +infrared emitting diode, Infineon +TO-18, lead spacing 2.54 mm, cathode marking<p> +Inifineon + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<B>LED</B><p> +rectangle, 5.7 x 3.2 mm + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<B>IR LED</B><p> +IR transmitter Siemens + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>TOPLED® High-optical Power LED (HOP)</b><p> +Source: http://www.osram.convergy.de/ ... ls_t675.pdf + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE +A +C + + + + + + + +<b>BLUE LINETM Hyper Mini TOPLED® Hyper-Bright LED</b><p> +Source: http://www.osram.convergy.de/ ... LB M676.pdf + + + + + + + + + + + + + + +A +C +>NAME +>VALUE + + + + + + + +<b>Super SIDELED® High-Current LED</b><p> +LG A672, LP A672 <br> +Source: http://www.osram.convergy.de/ ... LG_LP_A672.pdf (2004.05.13) + + + + + + + + + + + + + + + + + + + +C +A +>NAME +>VALUE + + + + + + + +<b>SmartLEDTM Hyper-Bright LED</b><p> +Source: http://www.osram.convergy.de/ ... LA_LO_LS_LY L896.pdf + + + + + + + + +>NAME +>VALUE + + + + + +<b>Hyper TOPLED® RG Hyper-Bright LED</b><p> +Source: http://www.osram.convergy.de/ ... LA_LO_LS_LY T776.pdf + + + + + + + + + + + + + + + + + + +>NAME +>VALUE +A +C + + + + + + + + + + +<b>Hyper Micro SIDELED®</b><p> +Source: http://www.osram.convergy.de/ ... LA_LO_LS_LY Y876.pdf + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + +<b>Power TOPLED®</b><p> +Source: http://www.osram.convergy.de/ ... LA_LO_LA_LY E67B.pdf + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE +C +A +C +C + + + + + + + + + + + +<b>Hyper CHIPLED Hyper-Bright LED</b><p> +LB Q993<br> +Source: http://www.osram.convergy.de/ ... Lb_q993.pdf + + + + +>NAME +>VALUE + + + + + + + +<b>Hyper CHIPLED Hyper-Bright LED</b><p> +LB R99A<br> +Source: http://www.osram.convergy.de/ ... lb_r99a.pdf + + + + +>NAME +>VALUE + + + + + + + +<b>Mini TOPLED Santana®</b><p> +Source: http://www.osram.convergy.de/ ... LG M470.pdf + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + +<b>CHIPLED</b><p> +Source: http://www.osram.convergy.de/ ... LG_R971.pdf + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + +<b>CHIPLED</b><p> +Source: http://www.osram.convergy.de/ ... LG_LY N971.pdf + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + +<b>CHIPLED</b><p> +Source: http://www.osram.convergy.de/ ... LG_LY Q971.pdf + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + +<b>CHIPLED-0603</b><p> +Recommended Solder Pad useable for SmartLEDTM and Chipled - Package 0603<br> +Package able to withstand TTW-soldering heat<br> +Package suitable for TTW-soldering<br> +Source: http://www.osram.convergy.de/ ... LO_LS_LY L89K.pdf + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + +<b>SmartLED TTW</b><p> +Recommended Solder Pad useable for SmartLEDTM and Chipled - Package 0603<br> +Package able to withstand TTW-soldering heat<br> +Package suitable for TTW-soldering<br> +Source: http://www.osram.convergy.de/ ... LO_LS_LY L89K.pdf + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + +<b>Lumileds Lighting. LUXEON®</b> with cool pad<p> +Source: K2.pdf + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<b>Lumileds Lighting. LUXEON®</b> without cool pad<p> +Source: K2.pdf + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + +<B>LED</B><p> +10 mm, round + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>SURFACE MOUNT LED LAMP</b> 3.5x2.8mm<p> +Source: http://www.kingbright.com/manager/upload/pdf/KA-3528ASYC(Ver1189474662.1) + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + +<b>SML0805-2CW-TR (0805 PROFILE)</b> COOL WHITE<p> +Source: http://www.ledtronics.com/ds/smd-0603/Dstr0093.pdf + + + + + + + + + + + +>NAME +>VALUE + + +<b>SML10XXKH-TR (HIGH INTENSITY) LED</b><p> +<table> +<tr><td>SML10R3KH-TR</td><td>ULTRA RED</td></tr> +<tr><td>SML10E3KH-TR</td><td>SUPER REDSUPER BLUE</td></tr> +<tr><td>SML10O3KH-TR</td><td>SUPER ORANGE</td></tr> +<tr><td>SML10PY3KH-TR</td><td>PURE YELLOW</td></tr> +<tr><td>SML10OY3KH-TR</td><td>ULTRA YELLOW</td></tr> +<tr><td>SML10AG3KH-TR</td><td>AQUA GREEN</td></tr> +<tr><td>SML10BG3KH-TR</td><td>BLUE GREEN</td></tr> +<tr><td>SML10PB1KH-TR</td><td>SUPER BLUE</td></tr> +<tr><td>SML10CW1KH-TR</td><td>WHITE</td></tr> +</table> + +Source: http://www.ledtronics.com/ds/smd-1206/dstr0094.PDF + + + + + + + +>NAME +>VALUE + + + + + + + + + +<b>SML0603-XXX (HIGH INTENSITY) LED</b><p> +<table> +<tr><td>AG3K</td><td>AQUA GREEN</td></tr> +<tr><td>B1K</td><td>SUPER BLUE</td></tr> +<tr><td>R1K</td><td>SUPER RED</td></tr> +<tr><td>R3K</td><td>ULTRA RED</td></tr> +<tr><td>O3K</td><td>SUPER ORANGE</td></tr> +<tr><td>O3KH</td><td>SOFT ORANGE</td></tr> +<tr><td>Y3KH</td><td>SUPER YELLOW</td></tr> +<tr><td>Y3K</td><td>SUPER YELLOW</td></tr> +<tr><td>2CW</td><td>WHITE</td></tr> +</table> +Source: http://www.ledtronics.com/ds/smd-0603/Dstr0092.pdf + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + +<b>LED</b><p> +<u>OSRAM</u>:<br> + +- <u>CHIPLED</u><br> +LG R971, LG N971, LY N971, LG Q971, LY Q971, LO R971, LY R971 +LH N974, LH R974<br> +LS Q976, LO Q976, LY Q976<br> +LO Q996<br> + +- <u>Hyper CHIPLED</u><br> +LW Q18S<br> +LB Q993, LB Q99A, LB R99A<br> + +- <u>SideLED</u><br> +LS A670, LO A670, LY A670, LG A670, LP A670<br> +LB A673, LV A673, LT A673, LW A673<br> +LH A674<br> +LY A675<br> +LS A676, LA A676, LO A676, LY A676, LW A676<br> +LS A679, LY A679, LG A679<br> + +- <u>Hyper Micro SIDELED®</u><br> +LS Y876, LA Y876, LO Y876, LY Y876<br> +LT Y87S<br> + +- <u>SmartLED</u><br> +LW L88C, LW L88S<br> +LB L89C, LB L89S, LG L890<br> +LS L89K, LO L89K, LY L89K<br> +LS L896, LA L896, LO L896, LY L896<br> + +- <u>TOPLED</u><br> +LS T670, LO T670, LY T670, LG T670, LP T670<br> +LSG T670, LSP T670, LSY T670, LOP T670, LYG T670<br> +LG T671, LOG T671, LSG T671<br> +LB T673, LV T673, LT T673, LW T673<br> +LH T674<br> +LS T676, LA T676, LO T676, LY T676, LB T676, LH T676, LSB T676, LW T676<br> +LB T67C, LV T67C, LT T67C, LS T67K, LO T67K, LY T67K, LW E67C<br> +LS E67B, LA E67B, LO E67B, LY E67B, LB E67C, LV E67C, LT E67C<br> +LW T67C<br> +LS T679, LY T679, LG T679<br> +LS T770, LO T770, LY T770, LG T770, LP T770<br> +LB T773, LV T773, LT T773, LW T773<br> +LH T774<br> +LS E675, LA E675, LY E675, LS T675<br> +LS T776, LA T776, LO T776, LY T776, LB T776<br> +LHGB T686<br> +LT T68C, LB T68C<br> + +- <u>Hyper Mini TOPLED®</u><br> +LB M676<br> + +- <u>Mini TOPLED Santana®</u><br> +LG M470<br> +LS M47K, LO M47K, LY M47K +<p> +Source: http://www.osram.convergy.de<p> + +<u>LUXEON:</u><br> +- <u>LUMILED®</u><br> +LXK2-PW12-R00, LXK2-PW12-S00, LXK2-PW14-U00, LXK2-PW14-V00<br> +LXK2-PM12-R00, LXK2-PM12-S00, LXK2-PM14-U00<br> +LXK2-PE12-Q00, LXK2-PE12-R00, LXK2-PE12-S00, LXK2-PE14-T00, LXK2-PE14-U00<br> +LXK2-PB12-K00, LXK2-PB12-L00, LXK2-PB12-M00, LXK2-PB14-N00, LXK2-PB14-P00, LXK2-PB14-Q00<br> +LXK2-PR12-L00, LXK2-PR12-M00, LXK2-PR14-Q00, LXK2-PR14-R00<br> +LXK2-PD12-Q00, LXK2-PD12-R00, LXK2-PD12-S00<br> +LXK2-PH12-R00, LXK2-PH12-S00<br> +LXK2-PL12-P00, LXK2-PL12-Q00, LXK2-PL12-R00 +<p> +Source: www.luxeon.com<p> + +<u>KINGBRIGHT:</U><p> +KA-3528ASYC<br> +Source: www.kingbright.com + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Based on STM PCB layout recomendations. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +STM32F103 Medium Density 48pins + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<b>MOLEX KK® Series Connectors</b> - v1.01 (08/17/2010)<p> +Receptacals and Headers<p> +<p>THIS LIBRARY IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED.<br> +USE AT YOUR OWN RISK!<p> +<author>Copyright (C) 2010, Bob Starr<br> http://www.bobstarr.net<br></author> + + +<b>RECEPTACAL</b><p> +Vertical, Bottom Entry, 0.1" pitch + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + +>NAME +>VALUE +>PART + + + + + + +>NAME + + + + + +<b>RECEPTACAL</b> + + + + + + + + + + + + + + + + + + + + + + + + + +<h3>SparkFun Electronics' preferred foot prints</h3> +In this library you'll find anything that moves- switches, relays, buttons, potentiometers. Also, anything that goes on a board but isn't electrical in nature- screws, standoffs, etc.<br><br> +We've spent an enormous amount of time creating and checking these footprints and parts, but it is the end user's responsibility to ensure correctness and suitablity for a given componet or application. If you enjoy using this library, please buy one of our products at www.sparkfun.com. +<br><br> +<b>Licensing:</b> Creative Commons ShareAlike 4.0 International - https://creativecommons.org/licenses/by-sa/4.0/ +<br><br> +You are welcome to use this library for commercial purposes. For attribution, we ask that when you begin to sell your device using our footprint, you email us with a link to the product being sold. We want bragging rights that we helped (in a very small part) to create your 8th world wonder. We would like the opportunity to feature your device on our homepage. + + + + + + + + + + + + + + + + + + +>NAME +>Value + + +<b>OMRON SWITCH</b> + + + + + + + + + + + + + + + + + + + + + + + + +>NAME + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + +<b>Momentary Switch</b><br> +Button commonly used for reset or general input.<br> +Spark Fun Electronics SKU : COM-00097<br> +SMT- SWCH-08247 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<b>Jumpers</b><p> +<author>Created by librarian@cadsoft.de</author> + + +<b>Solder jumper</b> + + + + + + + + + + + + + + +>NAME +>VALUE + + + +<b>Solder jumper</b> + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + +SMD solder <b>JUMPER</b> + + + + + + + + + + + + + + + + + + + + + + + + + + + +Developed by element14 :<br> +element14 CAD Library consolidation.ulp +at 30/07/2012 17:45:58 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +* + + + + + +* +>NAME +>VALUE + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +DUAL 2-INPUT POSITIVE-NAND GATE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<b>Resistors, Capacitors, Inductors</b><p> +Based on the previous libraries: +<ul> +<li>r.lbr +<li>cap.lbr +<li>cap-fe.lbr +<li>captant.lbr +<li>polcap.lbr +<li>ipc-smd.lbr +</ul> +All SMD packages are defined according to the IPC specifications and CECC<p> +<author>Created by librarian@cadsoft.de</author><p> +<p> +for Electrolyt Capacitors see also :<p> +www.bccomponents.com <p> +www.panasonic.com<p> +www.kemet.com<p> +http://www.secc.co.jp/pdf/os_e/2004/e_os_all.pdf <b>(SANYO)</b> +<p> +for trimmer refence see : <u>www.electrospec-inc.com/cross_references/trimpotcrossref.asp</u><p> + +<table border=0 cellspacing=0 cellpadding=0 width="100%" cellpaddding=0> +<tr valign="top"> + +<! <td width="10">&nbsp;</td> +<td width="90%"> + +<b><font color="#0000FF" size="4">TRIM-POT CROSS REFERENCE</font></b> +<P> +<TABLE BORDER=0 CELLSPACING=1 CELLPADDING=2> + <TR> + <TD COLSPAN=8> + <FONT SIZE=3 FACE=ARIAL><B>RECTANGULAR MULTI-TURN</B></FONT> + </TD> + </TR> + <TR> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">BOURNS</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">BI&nbsp;TECH</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">DALE-VISHAY</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">PHILIPS/MEPCO</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">MURATA</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">PANASONIC</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">SPECTROL</FONT> + </B> + </TD> + <TD ALIGN=CENTER> + <B> + <FONT SIZE=3 FACE=ARIAL color="#FF0000">MILSPEC</FONT> + </B> + </TD><TD>&nbsp;</TD> + </TR> + <TR> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3 > + 3005P<BR> + 3006P<BR> + 3006W<BR> + 3006Y<BR> + 3009P<BR> + 3009W<BR> + 3009Y<BR> + 3057J<BR> + 3057L<BR> + 3057P<BR> + 3057Y<BR> + 3059J<BR> + 3059L<BR> + 3059P<BR> + 3059Y<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + 89P<BR> + 89W<BR> + 89X<BR> + 89PH<BR> + 76P<BR> + 89XH<BR> + 78SLT<BR> + 78L&nbsp;ALT<BR> + 56P&nbsp;ALT<BR> + 78P&nbsp;ALT<BR> + T8S<BR> + 78L<BR> + 56P<BR> + 78P<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + T18/784<BR> + 783<BR> + 781<BR> + -<BR> + -<BR> + -<BR> + 2199<BR> + 1697/1897<BR> + 1680/1880<BR> + 2187<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + 8035EKP/CT20/RJ-20P<BR> + -<BR> + RJ-20X<BR> + -<BR> + -<BR> + -<BR> + 1211L<BR> + 8012EKQ&nbsp;ALT<BR> + 8012EKR&nbsp;ALT<BR> + 1211P<BR> + 8012EKJ<BR> + 8012EKL<BR> + 8012EKQ<BR> + 8012EKR<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + 2101P<BR> + 2101W<BR> + 2101Y<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 2102L<BR> + 2102S<BR> + 2102Y<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + EVMCOG<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + 43P<BR> + 43W<BR> + 43Y<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 40L<BR> + 40P<BR> + 40Y<BR> + 70Y-T602<BR> + 70L<BR> + 70P<BR> + 70Y<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + RT/RTR12<BR> + RT/RTR12<BR> + RT/RTR12<BR> + -<BR> + RJ/RJR12<BR> + RJ/RJR12<BR> + RJ/RJR12<BR></FONT> + </TD> + </TR> + <TR> + <TD COLSPAN=8>&nbsp; + </TD> + </TR> + <TR> + <TD COLSPAN=8> + <FONT SIZE=4 FACE=ARIAL><B>SQUARE MULTI-TURN</B></FONT> + </TD> + </TR> + <TR> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>BOURN</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>BI&nbsp;TECH</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>DALE-VISHAY</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>PHILIPS/MEPCO</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>MURATA</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>PANASONIC</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>SPECTROL</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>MILSPEC</B></FONT> + </TD> + </TR> + <TR> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 3250L<BR> + 3250P<BR> + 3250W<BR> + 3250X<BR> + 3252P<BR> + 3252W<BR> + 3252X<BR> + 3260P<BR> + 3260W<BR> + 3260X<BR> + 3262P<BR> + 3262W<BR> + 3262X<BR> + 3266P<BR> + 3266W<BR> + 3266X<BR> + 3290H<BR> + 3290P<BR> + 3290W<BR> + 3292P<BR> + 3292W<BR> + 3292X<BR> + 3296P<BR> + 3296W<BR> + 3296X<BR> + 3296Y<BR> + 3296Z<BR> + 3299P<BR> + 3299W<BR> + 3299X<BR> + 3299Y<BR> + 3299Z<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + 66P&nbsp;ALT<BR> + 66W&nbsp;ALT<BR> + 66X&nbsp;ALT<BR> + 66P&nbsp;ALT<BR> + 66W&nbsp;ALT<BR> + 66X&nbsp;ALT<BR> + -<BR> + 64W&nbsp;ALT<BR> + -<BR> + 64P&nbsp;ALT<BR> + 64W&nbsp;ALT<BR> + 64X&nbsp;ALT<BR> + 64P<BR> + 64W<BR> + 64X<BR> + 66X&nbsp;ALT<BR> + 66P&nbsp;ALT<BR> + 66W&nbsp;ALT<BR> + 66P<BR> + 66W<BR> + 66X<BR> + 67P<BR> + 67W<BR> + 67X<BR> + 67Y<BR> + 67Z<BR> + 68P<BR> + 68W<BR> + 68X<BR> + 67Y&nbsp;ALT<BR> + 67Z&nbsp;ALT<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 5050<BR> + 5091<BR> + 5080<BR> + 5087<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + T63YB<BR> + T63XB<BR> + -<BR> + -<BR> + -<BR> + 5887<BR> + 5891<BR> + 5880<BR> + -<BR> + -<BR> + -<BR> + T93Z<BR> + T93YA<BR> + T93XA<BR> + T93YB<BR> + T93XB<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 8026EKP<BR> + 8026EKW<BR> + 8026EKM<BR> + 8026EKP<BR> + 8026EKB<BR> + 8026EKM<BR> + 1309X<BR> + 1309P<BR> + 1309W<BR> + 8024EKP<BR> + 8024EKW<BR> + 8024EKN<BR> + RJ-9P/CT9P<BR> + RJ-9W<BR> + RJ-9X<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 3103P<BR> + 3103Y<BR> + 3103Z<BR> + 3103P<BR> + 3103Y<BR> + 3103Z<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 3105P/3106P<BR> + 3105W/3106W<BR> + 3105X/3106X<BR> + 3105Y/3106Y<BR> + 3105Z/3105Z<BR> + 3102P<BR> + 3102W<BR> + 3102X<BR> + 3102Y<BR> + 3102Z<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + EVMCBG<BR> + EVMCCG<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 55-1-X<BR> + 55-4-X<BR> + 55-3-X<BR> + 55-2-X<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 50-2-X<BR> + 50-4-X<BR> + 50-3-X<BR> + -<BR> + -<BR> + -<BR> + 64P<BR> + 64W<BR> + 64X<BR> + 64Y<BR> + 64Z<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + RT/RTR22<BR> + RT/RTR22<BR> + RT/RTR22<BR> + RT/RTR22<BR> + RJ/RJR22<BR> + RJ/RJR22<BR> + RJ/RJR22<BR> + RT/RTR26<BR> + RT/RTR26<BR> + RT/RTR26<BR> + RJ/RJR26<BR> + RJ/RJR26<BR> + RJ/RJR26<BR> + RJ/RJR26<BR> + RJ/RJR26<BR> + RJ/RJR26<BR> + RT/RTR24<BR> + RT/RTR24<BR> + RT/RTR24<BR> + RJ/RJR24<BR> + RJ/RJR24<BR> + RJ/RJR24<BR> + RJ/RJR24<BR> + RJ/RJR24<BR> + RJ/RJR24<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + </TR> + <TR> + <TD COLSPAN=8>&nbsp; + </TD> + </TR> + <TR> + <TD COLSPAN=8> + <FONT SIZE=4 FACE=ARIAL><B>SINGLE TURN</B></FONT> + </TD> + </TR> + <TR> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>BOURN</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>BI&nbsp;TECH</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>DALE-VISHAY</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>PHILIPS/MEPCO</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>MURATA</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>PANASONIC</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>SPECTROL</B></FONT> + </TD> + <TD ALIGN=CENTER> + <FONT SIZE=3 FACE=ARIAL><B>MILSPEC</B></FONT> + </TD> + </TR> + <TR> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 3323P<BR> + 3323S<BR> + 3323W<BR> + 3329H<BR> + 3329P<BR> + 3329W<BR> + 3339H<BR> + 3339P<BR> + 3339W<BR> + 3352E<BR> + 3352H<BR> + 3352K<BR> + 3352P<BR> + 3352T<BR> + 3352V<BR> + 3352W<BR> + 3362H<BR> + 3362M<BR> + 3362P<BR> + 3362R<BR> + 3362S<BR> + 3362U<BR> + 3362W<BR> + 3362X<BR> + 3386B<BR> + 3386C<BR> + 3386F<BR> + 3386H<BR> + 3386K<BR> + 3386M<BR> + 3386P<BR> + 3386S<BR> + 3386W<BR> + 3386X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 25P<BR> + 25S<BR> + 25RX<BR> + 82P<BR> + 82M<BR> + 82PA<BR> + -<BR> + -<BR> + -<BR> + 91E<BR> + 91X<BR> + 91T<BR> + 91B<BR> + 91A<BR> + 91V<BR> + 91W<BR> + 25W<BR> + 25V<BR> + 25P<BR> + -<BR> + 25S<BR> + 25U<BR> + 25RX<BR> + 25X<BR> + 72XW<BR> + 72XL<BR> + 72PM<BR> + 72RX<BR> + -<BR> + 72PX<BR> + 72P<BR> + 72RXW<BR> + 72RXL<BR> + 72X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + T7YB<BR> + T7YA<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + TXD<BR> + TYA<BR> + TYP<BR> + -<BR> + TYD<BR> + TX<BR> + -<BR> + 150SX<BR> + 100SX<BR> + 102T<BR> + 101S<BR> + 190T<BR> + 150TX<BR> + 101<BR> + -<BR> + -<BR> + 101SX<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + ET6P<BR> + ET6S<BR> + ET6X<BR> + RJ-6W/8014EMW<BR> + RJ-6P/8014EMP<BR> + RJ-6X/8014EMX<BR> + TM7W<BR> + TM7P<BR> + TM7X<BR> + -<BR> + 8017SMS<BR> + -<BR> + 8017SMB<BR> + 8017SMA<BR> + -<BR> + -<BR> + CT-6W<BR> + CT-6H<BR> + CT-6P<BR> + CT-6R<BR> + -<BR> + CT-6V<BR> + CT-6X<BR> + -<BR> + -<BR> + 8038EKV<BR> + -<BR> + 8038EKX<BR> + -<BR> + -<BR> + 8038EKP<BR> + 8038EKZ<BR> + 8038EKW<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + 3321H<BR> + 3321P<BR> + 3321N<BR> + 1102H<BR> + 1102P<BR> + 1102T<BR> + RVA0911V304A<BR> + -<BR> + RVA0911H413A<BR> + RVG0707V100A<BR> + RVA0607V(H)306A<BR> + RVA1214H213A<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 3104B<BR> + 3104C<BR> + 3104F<BR> + 3104H<BR> + -<BR> + 3104M<BR> + 3104P<BR> + 3104S<BR> + 3104W<BR> + 3104X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + EVMQ0G<BR> + EVMQIG<BR> + EVMQ3G<BR> + EVMS0G<BR> + EVMQ0G<BR> + EVMG0G<BR> + -<BR> + -<BR> + -<BR> + EVMK4GA00B<BR> + EVM30GA00B<BR> + EVMK0GA00B<BR> + EVM38GA00B<BR> + EVMB6<BR> + EVLQ0<BR> + -<BR> + EVMMSG<BR> + EVMMBG<BR> + EVMMAG<BR> + -<BR> + -<BR> + EVMMCS<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + EVMM1<BR> + -<BR> + -<BR> + EVMM0<BR> + -<BR> + -<BR> + EVMM3<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + 62-3-1<BR> + 62-1-2<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 67R<BR> + -<BR> + 67P<BR> + -<BR> + -<BR> + -<BR> + -<BR> + 67X<BR> + 63V<BR> + 63S<BR> + 63M<BR> + -<BR> + -<BR> + 63H<BR> + 63P<BR> + -<BR> + -<BR> + 63X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + RJ/RJR50<BR> + RJ/RJR50<BR> + RJ/RJR50<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + </TR> +</TABLE> +<P>&nbsp;<P> +<TABLE BORDER=0 CELLSPACING=1 CELLPADDING=3> + <TR> + <TD COLSPAN=7> + <FONT color="#0000FF" SIZE=4 FACE=ARIAL><B>SMD TRIM-POT CROSS REFERENCE</B></FONT> + <P> + <FONT SIZE=4 FACE=ARIAL><B>MULTI-TURN</B></FONT> + </TD> + </TR> + <TR> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>BOURNS</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>BI&nbsp;TECH</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>DALE-VISHAY</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>PHILIPS/MEPCO</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>PANASONIC</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>TOCOS</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>AUX/KYOCERA</B></FONT> + </TD> + </TR> + <TR> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 3224G<BR> + 3224J<BR> + 3224W<BR> + 3269P<BR> + 3269W<BR> + 3269X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 44G<BR> + 44J<BR> + 44W<BR> + 84P<BR> + 84W<BR> + 84X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + ST63Z<BR> + ST63Y<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + ST5P<BR> + ST5W<BR> + ST5X<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + </TR> + <TR> + <TD COLSPAN=7>&nbsp; + </TD> + </TR> + <TR> + <TD COLSPAN=7> + <FONT SIZE=4 FACE=ARIAL><B>SINGLE TURN</B></FONT> + </TD> + </TR> + <TR> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>BOURNS</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>BI&nbsp;TECH</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>DALE-VISHAY</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>PHILIPS/MEPCO</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>PANASONIC</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>TOCOS</B></FONT> + </TD> + <TD> + <FONT SIZE=3 FACE=ARIAL><B>AUX/KYOCERA</B></FONT> + </TD> + </TR> + <TR> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 3314G<BR> + 3314J<BR> + 3364A/B<BR> + 3364C/D<BR> + 3364W/X<BR> + 3313G<BR> + 3313J<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + 23B<BR> + 23A<BR> + 21X<BR> + 21W<BR> + -<BR> + 22B<BR> + 22A<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + ST5YL/ST53YL<BR> + ST5YJ/5T53YJ<BR> + ST-23A<BR> + ST-22B<BR> + ST-22<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + ST-4B<BR> + ST-4A<BR> + -<BR> + -<BR> + -<BR> + ST-3B<BR> + ST-3A<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + EVM-6YS<BR> + EVM-1E<BR> + EVM-1G<BR> + EVM-1D<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + G4B<BR> + G4A<BR> + TR04-3S1<BR> + TRG04-2S1<BR> + -<BR> + -<BR> + -<BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> + -<BR> + -<BR> + DVR-43A<BR> + CVR-42C<BR> + CVR-42A/C<BR> + -<BR> + -<BR></FONT> + </TD> + </TR> +</TABLE> +<P> +<FONT SIZE=4 FACE=ARIAL><B>ALT =&nbsp;ALTERNATE</B></FONT> +<P> + +&nbsp; +<P> +</td> +</tr> +</table> + + +<b>Ceramic Chip Capacitor KEMET 0805 reflow solder</b><p> +Metric Code Size 2012 + + + + +>NAME +>VALUE + + + + +<b>CAPACITOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b><p> + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b> + + + + + + + + +>NAME +>VALUE + + + + + +<b>CAPACITOR</b><p> +grid 2.5 mm, outline 2.4 x 4.4 mm + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 2.5 mm, outline 2.5 x 5 mm + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 2.5 mm, outline 3 x 5 mm + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 2.5 mm, outline 4 x 5 mm + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 2.5 mm, outline 5 x 5 mm + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 2.5 mm, outline 6 x 5 mm + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 2.5 mm + 5 mm, outline 2.4 x 7 mm + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 2.5 + 5 mm, outline 2.5 x 7.5 mm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 2.5 + 5 mm, outline 3.5 x 7.5 mm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 2.5 + 5 mm, outline 4.5 x 7.5 mm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 2.5 + 5 mm, outline 5.5 x 7.5 mm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 5 mm, outline 2.4 x 4.4 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>CAPACITOR</b><p> +grid 5 mm, outline 2.5 x 7.5 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 5 mm, outline 4.5 x 7.5 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 5 mm, outline 3 x 7.5 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 5 mm, outline 5 x 7.5 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 5 mm, outline 5.5 x 7.5 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 5 mm, outline 7.5 x 7.5 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +Horizontal, grid 5 mm, outline 7.5 x 7.5 mm + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<b>CAPACITOR</b><p> +grid 7.5 mm, outline 3.2 x 10.3 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 7.5 mm, outline 4.2 x 10.3 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 7.5 mm, outline 5.2 x 10.6 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 10.2 mm, outline 4.3 x 13.3 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 10.2 mm, outline 5.4 x 13.3 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 10.2 mm, outline 6.4 x 13.3 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 10.2 mm + 15.2 mm, outline 6.2 x 18.4 mm + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 15 mm, outline 5.4 x 18.3 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 15 mm, outline 6.4 x 18.3 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 15 mm, outline 7.2 x 18.3 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 15 mm, outline 8.4 x 18.3 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 15 mm, outline 9.1 x 18.2 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 22.5 mm, outline 6.2 x 26.8 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 22.5 mm, outline 7.4 x 26.8 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 22.5 mm, outline 8.7 x 26.8 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 22.5 mm, outline 10.8 x 26.8 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 22.5 mm, outline 11.3 x 26.8 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 27.5 mm, outline 9.3 x 31.6 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 27.5 mm, outline 11.3 x 31.6 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 27.5 mm, outline 13.4 x 31.6 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 27.5 mm, outline 20.5 x 31.6 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 32.5 mm, outline 13.7 x 37.4 mm + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 32.5 mm, outline 16.2 x 37.4 mm + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 32.5 mm, outline 18.2 x 37.4 mm + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 37.5 mm, outline 19.2 x 41.8 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 37.5 mm, outline 20.3 x 41.8 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 5 mm, outline 3.5 x 7.5 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 37.5 mm, outline 15.5 x 41.8 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 7.5 mm, outline 6.3 x 10.6 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 27.5 mm, outline 15.4 x 31.6 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>CAPACITOR</b><p> +grid 27.5 mm, outline 17.3 x 31.6 mm + + + + + + + + + + + + + + + + +>NAME +>VALUE + + +<b>Ceramic Chip Capacitor KEMET 0204 reflow solder</b><p> +Metric Code Size 1005 + + + + +>NAME +>VALUE + + + + +<b>Ceramic Chip Capacitor KEMET 0603 reflow solder</b><p> +Metric Code Size 1608 + + + + +>NAME +>VALUE + + + + +<b>Ceramic Chip Capacitor KEMET 1206 reflow solder</b><p> +Metric Code Size 3216 + + + + +>NAME +>VALUE + + + + +<b>Ceramic Chip Capacitor KEMET 1210 reflow solder</b><p> +Metric Code Size 3225 + + + + +>NAME +>VALUE + + + + +<b>Ceramic Chip Capacitor KEMET 1812 reflow solder</b><p> +Metric Code Size 4532 + + + + +>NAME +>VALUE + + + + +<b>Ceramic Chip Capacitor KEMET 1825 reflow solder</b><p> +Metric Code Size 4564 + + + + +>NAME +>VALUE + + + + +<b>Ceramic Chip Capacitor KEMET 2220 reflow solder</b><p>Metric Code Size 5650 + + + + +>NAME +>VALUE + + + + +<b>Ceramic Chip Capacitor KEMET 2225 reflow solder</b><p>Metric Code Size 5664 + + + + +>NAME +>VALUE + + + + +<b> </b><p> +Source: http://www.vishay.com/docs/10129/hpc0201a.pdf + + +>NAME +>VALUE + + + +Source: http://www.avxcorp.com/docs/catalogs/cx5r.pdf + + +>NAME +>VALUE + + + + + + +<b>CAPACITOR</b><p> +Source: AVX .. aphvc.pdf + + + + +>NAME +>VALUE + + + + +<b>CAPACITOR</b><p> +Source: AVX .. aphvc.pdf + + + + +>NAME +>VALUE + + + + + + + + +>NAME +>VALUE + + + + + + + + +<B>CAPACITOR</B>, European symbol + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<b>DIL/CODE SWITCH</b><p> +<p> +distributor Buerklin, 17G482 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + +PCB Outline +JR Multi + + + + +<b>DIL/CODE SWITCH</b> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +DIY Multi RF module library v0.3 + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<b>Pin Headers</b><p> +Naming:<p> +MA = male<p> +# contacts - # rows<p> +W = angled<p> +<author>Created by librarian@cadsoft.de</author> + + +<b>PIN HEADER</b> + + + + + + + + + + + + + + + + + + + + + + + +>NAME +1 +>VALUE + + + + + +<b>PIN HEADER</b> + + + + + + + + + + + + + + + + + + + + + + + + + + +1 +>NAME +6 +>VALUE + + + + + + + + +<b>PIN HEADER</b> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +1 +>VALUE +4 + + + + + + + + + + + + + + + +>VALUE +>NAME + + + + + + + + + + + + + + + +>VALUE +>NAME + + + + + + + + + + + + + + + + +>VALUE +>NAME + + + + + + + + +<b>PIN HEADER</b> + + + + + + + + + + + + + + + + + + + + + + +<b>PIN HEADER</b> + + + + + + + + + + + + + + + + + + + + + + + + + +<b>PIN HEADER</b> + + + + + + + + + + + + + + + + + + + + + + + + + +<b>Diodes</b><p> +Based on the following sources: +<ul> +<li>Motorola : www.onsemi.com +<li>Fairchild : www.fairchildsemi.com +<li>Philips : www.semiconductors.com +<li>Vishay : www.vishay.de +</ul> +<author>Created by librarian@cadsoft.de</author> + + +<B>DIODE</B><p> +diameter 2.54 mm, horizontal, grid 10.16 mm + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + +<B>DIODE</B><p> +diameter 2 mm, horizontal, grid 10.16 mm + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + +<B>DIODE</B><p> +diameter 4 mm, horizontal, grid 10 mm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<B>DIODE</B><p> +diameter 3.5 mm, horizontal, grid 12.7 mm + + + + + + + + +>NAME +>VALUE + + + + + +<B>DIODE</B><p> +diameter 4 mm, vertical, grid 10.16 mm + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + +<B>DIODE</B><p> +diameter 5.6 mm, horizontal, grid 15.24 mm + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + +<B>DIODE</B><p> +diameter 2.54 mm, horizontal, grid 10.16 mm + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + +<B>DIODE</B><p> +diameter 3 mm, horizontal, grid 10.16 mm + + + + + + + + +>NAME +>VALUE + + + + + +<B>DIODE</B><p> +diameter 5 mm, horizontal, grid 12.7 mm + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + +<B>DIODE</B><p> +diameter 1.8 mm, horizontal, grid 7.62 mm + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + +<B>DIODE</B><p> +2-lead plastic, vertical + + + + + + + + +>NAME +>VALUE + + +<B>DIODE</B> + + + + + + +>NAME +>VALUE + + + + + +<B>DIODE</B><p> +2-lead metall, vertical + + + + + + + +>NAME +>VALUE + + +<B>DIODE</B><p> +diameter 3.5 mm, vertical, grid 5.08 mm + + + + + +>NAME +>VALUE + + + +<B>DIODE</B><p> +diameter 3.5 mm, horizontal, grid 15.24 mm + + + + + + + + +>NAME +>VALUE + + + + + +<B>DIODE</B><p> +diameter 4 mm, vertical, grid 10.16 mm + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<B>DIODE</B><p> +diameter 4.8 mm, vertical, grid 10.16 mm + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + +<B>DIODE</B><p> +diameter 3.5 mm, vertical, grid 10.16 mm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + +<B>DIODE</B><p> +diameter 3.5 mm, vertical, grid 15.24 mm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + +<B>DIODE</B><p> +diameter 3.5 mm, vertical, grid 17.78 mm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + +<B>DIODE</B><p> +diameter 3.5 mm, vertical, grid 15.24 mm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + +<B>DIODE</B><p> +diameter 3.5 mm, vertical, grid 20.32 mm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + +<B>DIODE</B><p> +diameter 5 mm, horizontal, grid 15.24 mm + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + +<B>DIODE</B><p> +diameter 2.3 mm, vertical, grid 10.16 mm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + +<B>DIODE</B><p> +diameter 3.3 mm, vertical, grid 10.16 mm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + +<B>DIODE</B><p> +diameter 3 mm, horizontal, grid 10.16 mm + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + +<B>DIODE</B><p> +2-lead molded, vertical + + + + + + + + +>NAME +>VALUE + + + + + + + + +<B>DIODE</B><p> +2-lead molded, horizontal + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE +A17,5mm + + + + + + + + + +<B>DIODE</B><p> +2-lead molded, vertical + + + + + + + + +>NAME +>VALUE + + + + + + + + +<B>DIODE</B><p> +diameter 7.62 mm, horizontal, grid 12.7 mm + + + + + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + +<B>DIODE</B><p> +diameter 4.8 mm, vertical, grid 12.7 mm + + + + + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + +<B>DIODE</B> + + + + + + + + + +>NAME +>VALUE + + + + + +<B>DIODE</B><p> +diameter 9 mm, horizontal, grid 15.24 mm + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + +<B>DIODE</B><p> +diameter 5.2 mm, horizontal, grid 15.24 mm + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + +<B>DIODE</B><p> +2-lead molded, horizontal + + + + + + + + + + + + + + + + + + +>NAME +>VALUE +A17,5mm + + + + + + + + + +<B>DIODE</B> + + + + + + + +>NAME +>VALUE + + + + + +<b>DIODE</b> + + + + + + + + + + +>NAME +>VALUE + + + +<b>DIODE</b> + + + + + + + + + + +>NAME +>VALUE + + + + +<b>DIODE</b> + + + + + + + + + +>NAME +>VALUE + + +<b>DIODE</b> + + + + + + + + + + +>NAME +>VALUE + + + +<b>DIODE</b> + + + + + + + + + + +>NAME +>VALUE + + + +<b>SOD106 Reflow soldering</b> Philips SC01_Mounting_1996.pdf + + + + + + + +>NAME +>VALUE + + + + + +<b>DIODE</b> + + + + + + + + + +>NAME +>VALUE + + + + + +<b>SOD106 Wave soldering</b> Philips SC01_Mounting_1996.pdf + + + + + + + +>NAME +>VALUE + + + + + +<b>SOD106A Reflow soldering</b> Philips SC01_Mounting_1996.pdf + + + + + + + +>NAME +>VALUE + + + + + +<b>SOD110 Wave soldering</b> Philips SC01_Mounting_1996.pdf + + + + + + +>NAME +>VALUE + + + +<b>SOD110 Reflow soldering</b> Philips SC01_Mounting_1996.pdf + + + + + + +>NAME +>VALUE + + + +<b>Diode</b> + + + + + + +>NAME +>VALUE + + + + + +<b>SOD323 Reflow soldering</b> Philips SC01_Mounting_1996.pdf + + + + + + + + + +>NAME +>VALUE + + + +<b>SOD323 Wave soldering</b> Philips SC01_Mounting_1996.pdf + + + + + + + + + +>NAME +>VALUE + + + +<b>GF1</b><p> +General Semiconductor + + + + + + +>NAME +>VALUE + + + + + + +<b>Mini Melf Diode</b> + + + + + + + +>NAME +>VALUE + + + + + +<b>DIODE</b><p> +Package DO-213AB = http://www.diotec.com/pdf/sm4001.pdf + + + + + + + + + +>NAME +>VALUE + + + + + +<b>Micro Melf Diode Reflow soldering</b> VISHAY mcl4148.pdf + + + + +>NAME +>VALUE + + + + + +<b>Micro Melf Diode Wave soldering</b> VISHAY mcl4148.pdf + + + + +>NAME +>VALUE + + + + + +<b>Diode Package</b> Reflow soldering<p> +INFINEON, www.infineon.com/cmc_upload/0/000/010/257/eh_db_5b.pdf + + + + + + +>NAME +>VALUE + + + + + +<b>Diode Package</b> Reflow soldering<p> +INFINEON, www.infineon.com/cmc_upload/0/000/010/257/eh_db_5b.pdf + + + + + + +>NAME +>VALUE + + + + + +<b>DIODE</b> + + + + + + + + + +>NAME +>VALUE + + + + + +<b>DIODE</b> + + + + + + + + + +>NAME +>VALUE + + + + + +<b>DIODE</b> + + + + + + + + + +>NAME +>VALUE + + + + + +<b>SURFACE MOUNT GENERAL RECTIFIER</b> JEDEC DO-214AC molded platic body<p> +Method 2026<br> +Source: http://www.kingtronics.com/SMD_M7/M7_SMD_4007.pdf + + + + + + + + +>NAME +>VALUE + + + + + + +<b>DO41</b> 7.6mm x 2mm<p> +Source: http://www.diodes.com/datasheets/ds23001.pdf + + + + + + + + + + + + + + + +>NAME +>VALUE + + + + + + + + + + + + +>NAME +>VALUE + + +SpiceOrder 1 +SpiceOrder 2 + + + + +<b>DIODE</b> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<h3>SparkFun Electronics' preferred foot prints</h3> +We've spent an enormous amount of time creating and checking these footprints and parts. If you enjoy using this library, please buy one of our products at www.sparkfun.com. +<br><br> +<b>Licensing:</b> CC v3.0 Share-Alike You are welcome to use this library for commercial purposes. For attribution, we ask that when you begin to sell your device using our footprint, you email us with a link to the product being sold. We want bragging rights that we helped (in a very small part) to create your 8th world wonder. We would like the opportunity to feature your device on our homepage. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +small + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +All hardware is licensed under the Creative Commons +Attribution-Noncommercial-Share Alike 2.5 Switzerland License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/2.5/ch/ or send a letter to Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA. + + + + + + + + + + + + + + + + + + + + + + + + +<BR>Würth Elektronik -- Electronic Interconnect & Electromechanical Solutions<br><Hr> +<BR><BR> +<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0> +<TR> +<TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3><BR><br> + &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<BR> + <BR> + <BR> + <BR><BR></FONT> + </TD> +<TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3><br> + -----<BR> + -----<BR> + -----<BR> + -----<BR> + -----<BR><BR></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER> <FONT FACE=ARIAL SIZE=3><br> + ---------------------------<BR> +<B><I><span style='font-size:26pt; + color:#FF6600;'>WE </span></i></b> +<BR> + ---------------------------<BR><b>Würth Elektronik</b></FONT> + </TD> + <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3><br> + ---------O---<BR> + ----O--------<BR> + ---------O---<BR> + ----O--------<BR> + ---------O---<BR><BR></FONT> + </TD> + +<TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3><BR> + &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<BR> + <BR> + <BR> + <BR> + <BR><BR></FONT> + </TD> + </TR> + + <TR> + <TD COLSPAN=7>&nbsp; + </TD> + </TR> + +</TABLE> +<B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;More than you expect<BR><BR><BR></B> + +<HR><BR> +<b>Würth Elektronik eiSos GmbH & Co. KG</b><br> +EMC & Inductive Solutions<br> + +Max-Eyth-Str.1<br> +D-74638 Waldenburg<br> +<br> +Tel: +49 (0)7942-945-0<br> +Fax:+49 (0)7942-945-405<br> +<br> +<a href="http://www.we-online.com">http://www.we-online.com</a><br> +<a href="mailto:pm.hotline@we-online.de">pm.hotline@we-online.de</a> <BR><BR> +<br><HR><BR> +Neither CadSoft nor WE-eiSos does warrant that this library is error-free or <br> +that it meets your specific requirements.<br><BR> +Please contact us for more information.<br><BR><br> +<hr> +Version 1.2, May 6-th 2011 +<HR> +Copyright: Würth Elektronik + + +WR-COM Vertical 5 Contacts Mini USB Type B, 5 pins + + + + + + + + + + + + + + + +1 +5 +>NAME +>VALUE + + + + + + + + +>NAME +>VALUE + + + + + + + + + +WR-COM Vertical 5 Contacts Mini USB Type B, 5 pins + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +(c) M. Bloos +pcb@power-buggy.de + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +(c) M. Bloos +pcb@power-buggy.de + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Dual Programmable + inverter + SN74LVC2G86DCTR +(c) M. Bloos +pcb@power-buggy.de + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +(c) M. Bloos +pcb@power-buggy.de + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Since Version 6.2.2 text objects can contain more than one line, +which will not be processed correctly with this version. + + + From 4cb7ba83e9fcf5241a745a5d9a064f7d2d422a88 Mon Sep 17 00:00:00 2001 From: John-RB Date: Fri, 7 Apr 2017 11:17:51 -0400 Subject: [PATCH 017/121] Add V1.1 design to BOM --- docs/BOM_DIY_STM32 & Schematic.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/BOM_DIY_STM32 & Schematic.md b/docs/BOM_DIY_STM32 & Schematic.md index 27f65bd..f0b1201 100644 --- a/docs/BOM_DIY_STM32 & Schematic.md +++ b/docs/BOM_DIY_STM32 & Schematic.md @@ -13,7 +13,7 @@ In the case of the Turnigy 9X/9XR/9XR Pro you don't need to invert the telemetry The inverted telemetry signal is required by TARANIS TX and other boards so for telemetry to work properly the inverter chip must be installed. -## BOM DIY STM32 PCB V1.0t - the USB version +## BOM DIY STM32 PCB V1.0t & V1.1 - the USB version This BOM is for the board with the USB port which allows firmware upload. The board is available at OSHpark [here](https://oshpark.com/shared_projects/GX51nEoH) @@ -33,7 +33,7 @@ Qty|Part|Description|Value|Package|Digikey Part Number 1|C203|Cap Ceramic|4u7|0805|[311-1371-1-ND](https://www.digikey.com/product-detail/en/yageo/CC0805ZRY5V6BB475/311-1371-1-ND/2103155) 1|C207|Cap Ceramic|1uF|0805|[311-1365-1-ND](https://www.digikey.com/product-detail/en/yageo/CC0805KKX7R7BB105/311-1365-1-ND/2103149) 1|C208|Cap Ceramic|10nF|0805|[311-1136-1-ND](http://www.digikey.com/products/en?keywords=311-1136-1-ND) -4|D201,301,302,303|Diode Shottky|BAT48|SOD123|[497-5712-1-ND](http://www.digikey.com/products/en?keywords=497-5712-1-ND) +5|D101*,201,301,302,303|Diode Shottky|BAT48|SOD123|[497-5712-1-ND](http://www.digikey.com/products/en?keywords=497-5712-1-ND) 1|IC101|Voltage reg 5V|AMS1117-50|SOT223|[LM1117MP-5.0/NOPBCT-ND](https://www.digikey.com/product-detail/en/texas-instruments/LM1117MP-5.0-NOPB/LM1117MP-5.0-NOPBCT-ND/363589) 1|IC102|Voltage reg 3.3V|AMS1117-33|SOT223|[LM1117MPX-3.3/NOPBCT-ND](https://www.digikey.com/product-detail/en/texas-instruments/LM1117MPX-3.3-NOPB/LM1117MPX-3.3-NOPBCT-ND/1010516) 1|L101|High Freq Inductor|10uH|1812|[CM453232-100KLCT-ND](https://www.digikey.com/product-detail/en/bourns-inc/CM453232-100KL/CM453232-100KLCT-ND/3437938) @@ -55,6 +55,8 @@ Qty|Part|Description|Value|Package|Digikey Part Number 1|U301|Dual INPUT-XOR|SN74LVC2G86DCTR|SSM8|[296-13274-1-ND](http://www.digikey.com/product-detail/en/texas-instruments/SN74LVC2G86DCTR/296-13274-1-ND/484501) 1|CON401|ANT.conn SMD|||[WM5587CT-ND](https://www.digikey.com/product-detail/en/molex-llc/0734120110/WM5587CT-ND/1894612) +* Diode D101 is only required for the V1.1 board + PCB STM32 V1.0t Schematic From 49e3534738ab6ad0eef195146af5cf42f3b3f689 Mon Sep 17 00:00:00 2001 From: midelic Date: Sat, 8 Apr 2017 20:27:45 +0100 Subject: [PATCH 018/121] Add PCB _STM32_USB_V1.1 board files --- docs/images/Board_PCB_STM32_USB_V1.1-1.png | Bin 0 -> 34182 bytes docs/images/Board_PCB_STM32_USB_V1.1-2.png | Bin 0 -> 34724 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/images/Board_PCB_STM32_USB_V1.1-1.png create mode 100644 docs/images/Board_PCB_STM32_USB_V1.1-2.png diff --git a/docs/images/Board_PCB_STM32_USB_V1.1-1.png b/docs/images/Board_PCB_STM32_USB_V1.1-1.png new file mode 100644 index 0000000000000000000000000000000000000000..ba70160a4b5a599d06d1cd5dce31e4eddbdb775b GIT binary patch literal 34182 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 Date: Sat, 8 Apr 2017 20:37:18 +0100 Subject: [PATCH 019/121] Update BOM_DIY_STM32 & Schematic.md --- docs/BOM_DIY_STM32 & Schematic.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/docs/BOM_DIY_STM32 & Schematic.md b/docs/BOM_DIY_STM32 & Schematic.md index 27f65bd..fd6cf21 100644 --- a/docs/BOM_DIY_STM32 & Schematic.md +++ b/docs/BOM_DIY_STM32 & Schematic.md @@ -13,6 +13,12 @@ In the case of the Turnigy 9X/9XR/9XR Pro you don't need to invert the telemetry The inverted telemetry signal is required by TARANIS TX and other boards so for telemetry to work properly the inverter chip must be installed. +## BOM DIY STM32 PCB V1.1t - USB version update +The board is available at OSHpark [here](https://oshpark.com/shared_projects/eWtNW6jo) + + + + ## BOM DIY STM32 PCB V1.0t - the USB version This BOM is for the board with the USB port which allows firmware upload. @@ -98,9 +104,8 @@ Qty|Part|Description|Value|Package|Digikey Part Number ## BOM DIY STM32 PCB - the first Version This BOM is for the board that looks like this - check carefully: - +src="https://644db4de3505c40a0444-327723bce298e3ff5813fb42baeefbaa.ssl.cf1.rackcdn.com/2026cfd1d0187a770570052590168df1.png" width="300" height="400"/> Qty|Part|Description|Value|Package|Digikey Part Number From fa6f2061e707066f65f32f32926fb0e05d724332 Mon Sep 17 00:00:00 2001 From: John-RB Date: Sun, 9 Apr 2017 11:48:44 -0400 Subject: [PATCH 020/121] Add V1.1 design to BOM --- docs/BOM_DIY_STM32 & Schematic.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/docs/BOM_DIY_STM32 & Schematic.md b/docs/BOM_DIY_STM32 & Schematic.md index f0b1201..e132c16 100644 --- a/docs/BOM_DIY_STM32 & Schematic.md +++ b/docs/BOM_DIY_STM32 & Schematic.md @@ -13,6 +13,12 @@ In the case of the Turnigy 9X/9XR/9XR Pro you don't need to invert the telemetry The inverted telemetry signal is required by TARANIS TX and other boards so for telemetry to work properly the inverter chip must be installed. +## BOM DIY STM32 PCB V1.1t - USB version update +The board is available at OSHpark [here](https://oshpark.com/shared_projects/eWtNW6jo) + + + + ## BOM DIY STM32 PCB V1.0t & V1.1 - the USB version This BOM is for the board with the USB port which allows firmware upload. @@ -33,7 +39,7 @@ Qty|Part|Description|Value|Package|Digikey Part Number 1|C203|Cap Ceramic|4u7|0805|[311-1371-1-ND](https://www.digikey.com/product-detail/en/yageo/CC0805ZRY5V6BB475/311-1371-1-ND/2103155) 1|C207|Cap Ceramic|1uF|0805|[311-1365-1-ND](https://www.digikey.com/product-detail/en/yageo/CC0805KKX7R7BB105/311-1365-1-ND/2103149) 1|C208|Cap Ceramic|10nF|0805|[311-1136-1-ND](http://www.digikey.com/products/en?keywords=311-1136-1-ND) -5|D101*,201,301,302,303|Diode Shottky|BAT48|SOD123|[497-5712-1-ND](http://www.digikey.com/products/en?keywords=497-5712-1-ND) +5|D101*201,301,302,303|Diode Shottky|BAT48|SOD123|[497-5712-1-ND](http://www.digikey.com/products/en?keywords=497-5712-1-ND) 1|IC101|Voltage reg 5V|AMS1117-50|SOT223|[LM1117MP-5.0/NOPBCT-ND](https://www.digikey.com/product-detail/en/texas-instruments/LM1117MP-5.0-NOPB/LM1117MP-5.0-NOPBCT-ND/363589) 1|IC102|Voltage reg 3.3V|AMS1117-33|SOT223|[LM1117MPX-3.3/NOPBCT-ND](https://www.digikey.com/product-detail/en/texas-instruments/LM1117MPX-3.3-NOPB/LM1117MPX-3.3-NOPBCT-ND/1010516) 1|L101|High Freq Inductor|10uH|1812|[CM453232-100KLCT-ND](https://www.digikey.com/product-detail/en/bourns-inc/CM453232-100KL/CM453232-100KLCT-ND/3437938) @@ -100,9 +106,8 @@ Qty|Part|Description|Value|Package|Digikey Part Number ## BOM DIY STM32 PCB - the first Version This BOM is for the board that looks like this - check carefully: - +src="https://644db4de3505c40a0444-327723bce298e3ff5813fb42baeefbaa.ssl.cf1.rackcdn.com/2026cfd1d0187a770570052590168df1.png" width="300" height="400"/> Qty|Part|Description|Value|Package|Digikey Part Number From bdfeeb9a41ebc56e64a97d9c9bb15dd3aff49e66 Mon Sep 17 00:00:00 2001 From: pascallanger Date: Mon, 10 Apr 2017 11:24:21 +0200 Subject: [PATCH 021/121] Fix STM32 issue and OrangeTX compilation --- Multiprotocol/Multiprotocol.ino | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Multiprotocol/Multiprotocol.ino b/Multiprotocol/Multiprotocol.ino index c6b795b..83f0d8d 100644 --- a/Multiprotocol/Multiprotocol.ino +++ b/Multiprotocol/Multiprotocol.ino @@ -34,7 +34,7 @@ #endif //Personal config file -#if defined USE_MY_CONFIG || __has_include("_MyConfig.h") +#if defined USE_MY_CONFIG #include "_MyConfig.h" #endif @@ -207,6 +207,7 @@ void setup() TCC1.CTRLA = 0x0B ; // Event3 (prescale of 16) #elif defined STM32_BOARD //STM32 + afio_cfg_debug_ports(AFIO_DEBUG_NONE); pinMode(A7105_CSN_pin,OUTPUT); pinMode(CC25_CSN_pin,OUTPUT); pinMode(NRF_CSN_pin,OUTPUT); From 700b922350082ac39d538bbf8c0e1c72b2ecaddc Mon Sep 17 00:00:00 2001 From: pascallanger Date: Mon, 10 Apr 2017 11:33:26 +0200 Subject: [PATCH 022/121] Fix AFHDS2A power issue --- Multiprotocol/AFHDS2A_a7105.ino | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Multiprotocol/AFHDS2A_a7105.ino b/Multiprotocol/AFHDS2A_a7105.ino index 11ef094..158142d 100644 --- a/Multiprotocol/AFHDS2A_a7105.ino +++ b/Multiprotocol/AFHDS2A_a7105.ino @@ -260,6 +260,7 @@ uint16_t ReadAFHDS2A() while ((uint16_t)micros()-start < 700) // Wait max 700µs, using serial+telemetry exit in about 120µs if(!(A7105_ReadReg(A7105_00_MODE) & 0x01)) break; + A7105_SetPower(); A7105_SetTxRxMode(TXRX_OFF); // Turn LNA off since we are in near range and we want to prevent swamping A7105_Strobe(A7105_RX); phase &= ~AFHDS2A_WAIT_WRITE; @@ -325,6 +326,7 @@ uint16_t ReadAFHDS2A() while ((uint16_t)micros()-start < 700) // Wait max 700µs, using serial+telemetry exit in about 120µs if(!(A7105_ReadReg(A7105_00_MODE) & 0x01)) break; + A7105_SetPower(); A7105_SetTxRxMode(RX_EN); A7105_Strobe(A7105_RX); phase &= ~AFHDS2A_WAIT_WRITE; From 514bbbe8a3e53aa8ec9df605830ecd5fff892d4a Mon Sep 17 00:00:00 2001 From: John-RB Date: Mon, 10 Apr 2017 09:44:51 -0400 Subject: [PATCH 023/121] Missing comma in STM32 V1.1 BOM --- docs/BOM_DIY_STM32 & Schematic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/BOM_DIY_STM32 & Schematic.md b/docs/BOM_DIY_STM32 & Schematic.md index e132c16..8a280d1 100644 --- a/docs/BOM_DIY_STM32 & Schematic.md +++ b/docs/BOM_DIY_STM32 & Schematic.md @@ -39,7 +39,7 @@ Qty|Part|Description|Value|Package|Digikey Part Number 1|C203|Cap Ceramic|4u7|0805|[311-1371-1-ND](https://www.digikey.com/product-detail/en/yageo/CC0805ZRY5V6BB475/311-1371-1-ND/2103155) 1|C207|Cap Ceramic|1uF|0805|[311-1365-1-ND](https://www.digikey.com/product-detail/en/yageo/CC0805KKX7R7BB105/311-1365-1-ND/2103149) 1|C208|Cap Ceramic|10nF|0805|[311-1136-1-ND](http://www.digikey.com/products/en?keywords=311-1136-1-ND) -5|D101*201,301,302,303|Diode Shottky|BAT48|SOD123|[497-5712-1-ND](http://www.digikey.com/products/en?keywords=497-5712-1-ND) +5|D101*,201,301,302,303|Diode Shottky|BAT48|SOD123|[497-5712-1-ND](http://www.digikey.com/products/en?keywords=497-5712-1-ND) 1|IC101|Voltage reg 5V|AMS1117-50|SOT223|[LM1117MP-5.0/NOPBCT-ND](https://www.digikey.com/product-detail/en/texas-instruments/LM1117MP-5.0-NOPB/LM1117MP-5.0-NOPBCT-ND/363589) 1|IC102|Voltage reg 3.3V|AMS1117-33|SOT223|[LM1117MPX-3.3/NOPBCT-ND](https://www.digikey.com/product-detail/en/texas-instruments/LM1117MPX-3.3-NOPB/LM1117MPX-3.3-NOPBCT-ND/1010516) 1|L101|High Freq Inductor|10uH|1812|[CM453232-100KLCT-ND](https://www.digikey.com/product-detail/en/bourns-inc/CM453232-100KL/CM453232-100KLCT-ND/3437938) From 3850ce88d397805ad539a025c8bc172d9857d2e1 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Wed, 12 Apr 2017 16:10:18 +0200 Subject: [PATCH 024/121] DSM: Remove special bind stick positionsD Spektrum own remotes transmit normal values during bind and actually use this (e.g. Nano CP X) to select the transmitter mode (e.g. computer vs non-computer radio, so always end normal output --- Multiprotocol/DSM_cyrf6936.ino | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/Multiprotocol/DSM_cyrf6936.ino b/Multiprotocol/DSM_cyrf6936.ino index f3120d1..6b4aef1 100644 --- a/Multiprotocol/DSM_cyrf6936.ino +++ b/Multiprotocol/DSM_cyrf6936.ino @@ -273,14 +273,10 @@ static void __attribute__((unused)) DSM_build_data_packet(uint8_t upper) uint16_t value = 0xffff;; if (idx != 0xff) { - if (!IS_BIND_DONE_on) - { // Failsafe position during binding - value=max/2; //all channels to middle - if(idx==0) - value=1; //except throttle - } - else - value=map(Servo_data[CH_TAER[idx]],servo_min_125,servo_max_125,0,max); + /* Spektrum own remotes transmit normal values during bind and actually + * use this (e.g. Nano CP X) to select the transmitter mode (e.g. computer vs + * non-computer radio, so always end normal output */ + value=map(Servo_data[CH_TAER[idx]],servo_min_125,servo_max_125,0,max); value |= (upper && i==0 ? 0x8000 : 0) | (idx << bits); } packet[i*2+2] = (value >> 8) & 0xff; @@ -582,4 +578,4 @@ uint16_t initDsm() return 10000; } -#endif \ No newline at end of file +#endif From fa52a1a81e80c630b27ca53bf4dd405e993025b3 Mon Sep 17 00:00:00 2001 From: midelic Date: Tue, 18 Apr 2017 16:05:52 +0100 Subject: [PATCH 025/121] fix sintax errors --- docs/Compiling_STM32.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/Compiling_STM32.md b/docs/Compiling_STM32.md index 2c73cc1..fe1ccda 100644 --- a/docs/Compiling_STM32.md +++ b/docs/Compiling_STM32.md @@ -18,9 +18,9 @@ Flashing precompiled **binaries** is done very simple with the cable setup prese -##Compiling source and flashing in Arduino. +## Compiling source and flashing in Arduino. -###Install the Arduino IDE and the Multiprotocol project +### Install the Arduino IDE and the Multiprotocol project 1. Download the Arduino IDE. The currently supported Arduino version is 1.6.11 available for [Windows]( https://www.arduino.cc/download_handler.php?f=/arduino-1.6.12-windows.exe) and [Mac OSX](http://arduino.cc/download_handler.php?f=/arduino-1.6.12-macosx.zip) 1. It is recommended to upgrade Java to the [latest version](https://www.java.com/en/download/) 1. Download the [STM32 Core](https://github.com/rogerclarkmelbourne/Arduino_STM32/archive/master.zip) and copy the Arduino_STM32 folder to: @@ -32,7 +32,7 @@ Flashing precompiled **binaries** is done very simple with the cable setup prese 1. Unzip and copy the source code folder ```Multiprotocol``` to a folder of your choosing 1. Click on the ```Multiprotocol.ino file``` in the ```Multiprotocol``` folder and the Arduino environment should appear and the Multiprotocol project will be loaded. -###Prepare the Arduino IDE: +### Prepare the Arduino IDE: 1. In order to compile successfully you need also to modify a maple library file. In ```....\hardware\Arduino_STM32\STM32F1\cores\maple\libmaple\usart_f1.c``` comment out the 2 functions as shown below. This is required to have low-level access to the USART interrupt. @@ -63,7 +63,7 @@ There are three options for flashing the firmware. But We will present here only The first (and strongly recommended) is flashing it while it is plugged into and powered by the transmitter.The second is preparing the board for flashing with a USB cable. The second method is definitely the easiest in the long-term, but it does require the USB bord and setting up the bootloader on the STM32 MCU. -####Option 1: Flashing with Tx power(highly recommended) +### Option 1: Flashing with Tx power(highly recommended) 1. Put the module in the Tx 1. Place a jumper over the BOOT0 pins.Skip this one if you made your own cable for flashing ,see below. @@ -86,7 +86,7 @@ See below my module for reference [] -####Option 2: Flashing with USB cable. +### Option 2: Flashing with USB cable. This method use USB connector on the STM32 V1.0 board or on the maple clone board. From 8661b8074c76631d6eba6a4a736c66a2e21f5461 Mon Sep 17 00:00:00 2001 From: midelic Date: Tue, 18 Apr 2017 16:22:33 +0100 Subject: [PATCH 026/121] added useful info regarding compiling --- docs/Compiling_STM32.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/Compiling_STM32.md b/docs/Compiling_STM32.md index fe1ccda..0eed264 100644 --- a/docs/Compiling_STM32.md +++ b/docs/Compiling_STM32.md @@ -53,8 +53,8 @@ Flashing precompiled **binaries** is done very simple with the cable setup prese 1. Run the IDE, and on the **Tools** menu, select **Board** and then **Boards manager**. Click on the Arduino DUE (32 Bits ARM-Cortex M3) from the list of available boards. You must do this step, it installs the arm-none-eabi-g++ toolchain! 1. Close and reopen the Arduino IDE and load the Multiprotocol project. -1. In arduino IDE under the **Tools** -> **Board:** select the **Generic STM32F103C series** board -1. Click on the **Verify** button to test compile the before you make any changes. If there are any errors check the process above and be sure to have the right version of the Arduino IDE.The binary file generated location is presented at the bottom of Arduino IDE compiling window.Now continue with flashing procedure. +1. In arduino IDE under the **Tools** -> **Board:** select the **Generic STM32F103C series** board.Select upload method serial **Serial**.Do not leave upload method on default **STM32duino bootloader** +1. Click on the **Verify** button to test compile the before you make any changes. If there are any errors check the process above and be sure to have the right version of the Arduino IDE.The **binary** file generated location is presented at the bottom of Arduino IDE compiling window.Now continue with flashing procedure. ### Flashing the multimodule From 0cb0128cafdb24c19eb4228f223b1af9a25ff496 Mon Sep 17 00:00:00 2001 From: LapinFou Date: Tue, 18 Apr 2017 17:46:11 +0200 Subject: [PATCH 027/121] Test --- README.md | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 1924bf3..4c8f071 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ One of the most attractive features of the MULTI-module is the ability to send t In constructing a functioning MULTI-Module there are important choices to be made and tradeoffs to be aware of. The most important are: -##**Choice 1:** Which MULTI-Module hardware option +## **Choice 1:** Which MULTI-Module hardware option There are currently four generic paths to get your hands on an MULTI-Module. These are outlined in detail on the [hardware](docs/Hardware.md) page. Here they are, in order of increasing difficulty: - **Ready-made MULTI-Module** - Available from Banggood which includes a 4-in-1 RF module and an antenna switcher @@ -59,35 +59,35 @@ The last option is where it all started and how the pioneers in this project mad For more information on these options see the [hardware](docs/Hardware.md) page -##**Choice 2:** Which RF modules to include in the MULTI-Module +## **Choice 2:** Which RF modules to include in the MULTI-Module This depends on your specific needs. However, recent the availability of the 4-in-1 RF modules from Banggood for less than $35 makes it easy to “have it all”. Most manufacturers of RC systems (Spektrum, FrSky, FlySky) and toys (Syma, Hubsan, etc.) use one of these four RF chips to manage the RF link between the transmitter and the reciever/model. Here is an incomplete list of the RF modules and some of the most popular toys that use them. For the complete list see the [Protocol Details](Protocols_Details.md) page. Manufacturer|RF Chip|Example Protocols :-----------|-------|:------- -Cyprus Semiconductor| CYRF6936|DSM/DSMX - | |Walkera Devo - | |J6Pro -Texas Instruments|CC2500|FrSky - | |Futaba SFHSS -Amiccom|A7105|FlySky - | |FlySky AFHDS2A - | |Hubsan -Nordic Semiconductor|NRF24L01|HiSky - | |Syma - | |ASSAN - | |and most other Chinese models +Cyprus Semiconductor | CYRF6936 | DSM/DSMX + | | Walkera Devo + | | J6Pro +Texas Instruments | CC2500 | FrSky + | | Futaba SFHSS +Amiccom | A7105 | FlySky + | | FlySky AFHDS2A + | | Hubsan +Nordic Semiconductor | NRF24L01 | HiSky + | | Syma + | | ASSAN + | | and most other Chinese models For example, if you have no interest in binding your Tx to an model with and FrSky or Futaba SFHSS receiver you do not need to include the CC2500 RF module in your system. -##**Choice 3:** Which protocols to upload to the MULTI-Module +## **Choice 3:** Which protocols to upload to the MULTI-Module Of course there is always a catch. In this case it is the 32KB memory limit on the ATmega328 processor. Due to the amazing work done by devs on this project, the memory required by all the possible protocols exceeds this limit considerably. This means that you will need to make a choice of which protocols you will compile into your firmware. Fortunately, the process of selecting and compiling is not too difficult and it is fully documented on the [Compiling and Programming](docs/Compiling.md) page. Also, the lead dev Pascal Langer (rcgroups:hpnuts) makes this process even easier for many users by making compiled binaries available for three popular combinations of RF modules. These are always “fresh” (based on the latest stable firmware) and available on the [Releases](https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/releases) page. An alternatice is to use a STM32 ARM microcontroller based module. If you go the route of building this version of the DIY MULTI-Module then the memory limits do not apply anymore. -##**Choice 4:** Choosing the type of interface between the MULTI-Module and your radio (PPM or Serial) +## **Choice 4:** Choosing the type of interface between the MULTI-Module and your radio (PPM or Serial) The MULTI-Module supports industry standard PPM interface that works with all transmitters with either: - a module bay or @@ -100,7 +100,7 @@ If you are the owner of a transmitter that supports the er9X/erSky9X or OpenTX f - The model protocol selection and binding is done from the Model Settings menu on the Tx - For telemetry capable transmitters, the telemetry integration is done seamlessly with the Tx firmware. (Note that FrSky TH9X/Turnigy 9X/R transmitters require a telemetry mod to be done before telemetry can work). Click on the link corressponding to your Tx on the [Transmitters](docs/Transmitters.md) page for more details. -#How to get started? +# How to get started? 1. Browse the [Protocols](Protocols_Details.md) page to see which protocols you would like on your module 1. Go to the [Hardware Options](docs/Hardware.md) page to decide which of the MULTI-Module hardware options appeals to you and which RF modules you plan to integrate 1. Once you have your module, you should review what jumper settings or modifications are required to the module to support serial communication and possibly telemetry From 5c06a241acf596189d601bab349fb6c5d967b2a6 Mon Sep 17 00:00:00 2001 From: LapinFou Date: Tue, 18 Apr 2017 17:48:04 +0200 Subject: [PATCH 028/121] Try to fix table. --- README.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 4c8f071..8fed751 100644 --- a/README.md +++ b/README.md @@ -65,18 +65,18 @@ This depends on your specific needs. However, recent the availability of the 4- Manufacturer|RF Chip|Example Protocols :-----------|-------|:------- -Cyprus Semiconductor | CYRF6936 | DSM/DSMX - | | Walkera Devo - | | J6Pro -Texas Instruments | CC2500 | FrSky - | | Futaba SFHSS -Amiccom | A7105 | FlySky - | | FlySky AFHDS2A - | | Hubsan -Nordic Semiconductor | NRF24L01 | HiSky - | | Syma - | | ASSAN - | | and most other Chinese models +Cyprus Semiconductor|CYRF6936|DSM/DSMX +||Walkera Devo +||J6Pro +Texas Instruments|CC2500|FrSky +||Futaba SFHSS +Amiccom|A7105|FlySky +||FlySky AFHDS2A +||Hubsan +Nordic Semiconductor|NRF24L01|HiSky +||Syma +||ASSAN +||and most other Chinese models For example, if you have no interest in binding your Tx to an model with and FrSky or Futaba SFHSS receiver you do not need to include the CC2500 RF module in your system. From 7ee0b2b0a35467b0f422c11f6e2a1c64e3f2a857 Mon Sep 17 00:00:00 2001 From: LapinFou Date: Tue, 18 Apr 2017 17:52:12 +0200 Subject: [PATCH 029/121] Try to fix again the table. --- README.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 8fed751..d409bd6 100644 --- a/README.md +++ b/README.md @@ -63,20 +63,20 @@ For more information on these options see the [hardware](docs/Hardware.md) page This depends on your specific needs. However, recent the availability of the 4-in-1 RF modules from Banggood for less than $35 makes it easy to “have it all”. Most manufacturers of RC systems (Spektrum, FrSky, FlySky) and toys (Syma, Hubsan, etc.) use one of these four RF chips to manage the RF link between the transmitter and the reciever/model. Here is an incomplete list of the RF modules and some of the most popular toys that use them. For the complete list see the [Protocol Details](Protocols_Details.md) page. -Manufacturer|RF Chip|Example Protocols -:-----------|-------|:------- -Cyprus Semiconductor|CYRF6936|DSM/DSMX -||Walkera Devo -||J6Pro -Texas Instruments|CC2500|FrSky -||Futaba SFHSS -Amiccom|A7105|FlySky -||FlySky AFHDS2A -||Hubsan -Nordic Semiconductor|NRF24L01|HiSky -||Syma -||ASSAN -||and most other Chinese models +|Manufacturer|RF Chip|Example Protocols| +|:-----------|-------|:-------| +|Cyprus Semiconductor|CYRF6936|DSM/DSMX| +|||Walkera Devo| +|||J6Pro| +|Texas Instruments|CC2500|FrSky| +|||Futaba SFHSS| +|Amiccom|A7105|FlySky| +|||FlySky AFHDS2A| +|||Hubsan| +|Nordic Semiconductor|NRF24L01|HiSky| +|||Syma| +|||ASSAN| +|||and most other Chinese models| For example, if you have no interest in binding your Tx to an model with and FrSky or Futaba SFHSS receiver you do not need to include the CC2500 RF module in your system. From 84922e84a3a364ec8cbd93da4915dd56a8ce068d Mon Sep 17 00:00:00 2001 From: LapinFou Date: Tue, 18 Apr 2017 18:09:50 +0200 Subject: [PATCH 030/121] Fixed Markdown typos. --- README.md | 2 +- docs/Advanced_Bluetooth_Telemetry.md | 7 ++- ...vanced_Manually_Setting_ATmega328_Fuses.md | 4 +- docs/Advanced_Topics.md | 12 ++-- docs/Compiling.md | 28 +++++---- docs/Compiling_STM32.md | 23 +++---- docs/Models.md | 60 +++++++++++-------- docs/Troubleshooting.md | 22 ++++--- 8 files changed, 90 insertions(+), 68 deletions(-) diff --git a/README.md b/README.md index d409bd6..fe76196 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ For more information on these options see the [hardware](docs/Hardware.md) page This depends on your specific needs. However, recent the availability of the 4-in-1 RF modules from Banggood for less than $35 makes it easy to “have it all”. Most manufacturers of RC systems (Spektrum, FrSky, FlySky) and toys (Syma, Hubsan, etc.) use one of these four RF chips to manage the RF link between the transmitter and the reciever/model. Here is an incomplete list of the RF modules and some of the most popular toys that use them. For the complete list see the [Protocol Details](Protocols_Details.md) page. |Manufacturer|RF Chip|Example Protocols| -|:-----------|-------|:-------| +|---|---|---| |Cyprus Semiconductor|CYRF6936|DSM/DSMX| |||Walkera Devo| |||J6Pro| diff --git a/docs/Advanced_Bluetooth_Telemetry.md b/docs/Advanced_Bluetooth_Telemetry.md index 00ee878..a0a237d 100644 --- a/docs/Advanced_Bluetooth_Telemetry.md +++ b/docs/Advanced_Bluetooth_Telemetry.md @@ -1,5 +1,6 @@ -#Bluetooth Telemetry in PPM Mode -###Telemetry +# Bluetooth Telemetry in PPM Mode + +## Telemetry There are 4 protocols supporting telemetry: Hubsan, DSM, FrSkyD and FrSkyX. @@ -11,7 +12,7 @@ FrSkyD displays full telemetry (A0, A1, RX RSSI, TX RSSI and Hub). FrSkyX displays full telemetry (A1, A2, RX RSSI, TX RSSI and Hub). -### If used in PPM mode +## If used in PPM mode Telemetry is available as a serial output on the TX pin of the Atmega328p using the FrSky hub format for Hubsan, FrSkyD, FrSkyX and DSM format for DSM2/X. The serial paramets depends on the protocol: diff --git a/docs/Advanced_Manually_Setting_ATmega328_Fuses.md b/docs/Advanced_Manually_Setting_ATmega328_Fuses.md index ff202cf..d2c8c1b 100644 --- a/docs/Advanced_Manually_Setting_ATmega328_Fuses.md +++ b/docs/Advanced_Manually_Setting_ATmega328_Fuses.md @@ -1,4 +1,4 @@ -#Manually Uploading HEX files and setting Fuses on ATmega328 +# Manually Uploading HEX files and setting Fuses on ATmega328 **The .hex files provided are only for tests purpose. The recommended method is to use [Compiling and Programming](Compiling.md).** @@ -32,7 +32,7 @@ Banggood 4-in-1 module with [custom mikeb bootloader](Advanced_ATmega_Serial_Upl If you don't know which one to take the 1st line is the one you want. -###Burn the fuses +### Burn the fuses 1. Follow this section: [Connect the programmer](https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/blob/master/docs/Compiling.md#connect-the-programmer) 1. Launch AVR8 Burn-O-Mat. 1. In the **AVR type** drop down select **ATmega328P** and click on **Fuses** diff --git a/docs/Advanced_Topics.md b/docs/Advanced_Topics.md index 4faf3e8..67f6c34 100644 --- a/docs/Advanced_Topics.md +++ b/docs/Advanced_Topics.md @@ -1,26 +1,28 @@ -#Advanced Topics {This page is currently a proof of concept} +# Advanced Topics {This page is currently a proof of concept} Warning: the topics on this page are not for the fainthearted. It is strongly recommended that you have some experience in getting up and runnning with your module before you dive in there. On the other hand what is described on this page are some very useful options that could greatly increase the value and the enjoyment of your Multiprotocol module. -#Serial uploader that works through the transmitter pins + +# Serial uploader that works through the transmitter pins This document describes how you can set up your ATmega-based Mulitprotocol module to allow you to update the firmware by connecting a USB to TTL serial (like a FTDI) adapter to the module's transmitter interface pins. It is great if you exclusively use the Serial interface with your transmitter because the Bind button is used as "bootloader" button. It requires a small custom bootloader to be uploaded and a simple interface cable to be soldered up. See the [Advanced ATmega Serial Uploader](Advanced_ATmega_Serial_Uploader.md) page for more details. Created and supported by: Mike Blandford RCGroups page: http://www.rcgroups.com/forums/showpost.php?p=35584619&postcount=4867 -#Telemetry in PPM mode +# Telemetry in PPM mode It is possible to access the telemetry stream coming from the receiver through the MULTI-module. This document describes a simple bluetooth module to stream telemetry information to a mobile device like an Android smartphone or tablet. The method may be generalized to feed telemetry to the transmitter if the transmitter has the capabilities to process the information. This is very useful with modules used in the PPM mode with transmitters that do not support telemetry. See the [Advanced Bluetooth Telemetry](Advanced_Bluetooth_Telemetry.md) page for more details. Created and supported by: Midelic RCGroups page: None -#Manually setting fuses on ATmega328 +# Manually setting fuses on ATmega328 This document describes a relatively simple process to set the fuses on ATmega328 using the flexibility of the command line. It does not require installation of AVRdude because it uses the AVRdude that is bundled with the Arduino IDE. See the [Advanced Manually Setting ATmega328 Fuses](Advanced_Manually_Setting_ATmega328_Fuses.md) page for more details. Created and supported by: hpnuts ## Flashing Multi_STM32 module. -####Flashing without Tx power +#### Flashing without Tx power + This is another method of Flshing Multi_STM32 which is riskier.This method is for skilled users who understand the task. The key difference of this method is that the 3.3V FTDI cable must also provide power to the 5V circuitry during the flashing process. To do this, a jumper must be enabled connecting the 3.3V VCC to the 5V line. The risk is to forget 3.3V jumper in, after flashing and when TX restarted. diff --git a/docs/Compiling.md b/docs/Compiling.md index 19376e2..07dc80c 100644 --- a/docs/Compiling.md +++ b/docs/Compiling.md @@ -4,7 +4,7 @@ Multiprotocol source are compiled using the well known Arduino IDE. The procedure below will guide you through all the steps to upload successfully a customized firmware. -##Install the Arduino IDE and the Multiprotocol project firmware +## Install the Arduino IDE and the Multiprotocol project firmware 1. Download and install the Arduino IDE. The currently supported Arduino version is 1.6.12. available for [Windows]( https://www.arduino.cc/download_handler.php?f=/arduino-1.6.12-windows.exe) and [Mac OSX](https://www.arduino.cc/download_handler.php?f=/arduino-1.6.12-macosx.zip) 1. It is recommended to upgrade Java to the [latest version](https://www.java.com/en/download/) 1. Download the zip file with the Multiprotocol module source code from [here](https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/archive/master.zip) @@ -13,20 +13,29 @@ The procedure below will guide you through all the steps to upload successfully ## Upload the firmware -###Material you need to upload the firmware -1. USBASP programmer supporting 3.3V: [(example aliexpress link)](https://www.aliexpress.com/item/USBasp-USB-ISP-3-3V-5V-AVR-Programmer-USB-ATMEGA8-ATMEGA128-New-10PIN-Wire-Support/2036402518.html?spm=2114.30010308.8.10.jIbHzs). There are reports that some of the cheap programmers are not safe to use with 3.3V units, usually the black PCB versions are ok. -1. 10pin to 6pin adapter: [(example ebay link)](http://www.ebay.fr/itm/10-Pin-a-6-Pin-Carte-Adaptateur-M-F-pour-AVRISP-USBASP-STK500-Noir-Bleu-WT-/291862396761?hash=item43f45abf59:g:gXsAAOSwMgdXyGnh) -1. 6 pin header like this one: [(example Digi-Key link)](http://www.digikey.com/products/en?keywords=3M%20961206-6404-AR) +### Material you need to upload the firmware + +1. USBASP programmer supporting 3.3V: + [(example aliexpress link)](https://www.aliexpress.com/item/USBasp-USB-ISP-3-3V-5V-AVR-Programmer-USB-ATMEGA8-ATMEGA128-New-10PIN-Wire-Support/2036402518.html?spm=2114.30010308.8.10.jIbHzs) +There are reports that some of the cheap programmers are not safe to use with 3.3V units, usually the black PCB versions are ok. + +1. 10pin to 6pin adapter: + [(example ebay link)](http://www.ebay.fr/itm/10-Pin-a-6-Pin-Carte-Adaptateur-M-F-pour-AVRISP-USBASP-STK500-Noir-Bleu-WT-/291862396761?hash=item43f45abf59:g:gXsAAOSwMgdXyGnh) + +1. 6 pin header like this one: + [(example Digi-Key link)](http://www.digikey.com/products/en?keywords=3M%20961206-6404-AR) The 6 Pin header needs to be solder on the board like indicated by the red rectangle: * Banggood readymade 4-in-1 module: + * DIY Mulitprotocol modules (like the 2.3d board): + * Arduino Pro Mini module: -###Connect the programmer +### Connect the programmer 1. Before you connect the programmer make sure that you have selected the 3.3V mode and not 5V. The RF Modules are not 5V tolerant and you will break them with 5V. On most programmers this is done by moving a jumper. @@ -46,13 +55,13 @@ You are now ready to plug in the USB programmer to the computer If you are looking for a good working USBASP Windows driver, [use this one](http://www.protostack.com/download/USBasp-win-driver-x86-x64-v3.0.7.zip). -###Configure Arduino IDE for Multiprotocol +### Configure Arduino IDE for Multiprotocol 1. Under Tools -> Board select the Arduino Pro or Pro Mini 1. Under Tools -> Processor select the ATmega328 (5V, 16MHz) 1. Under Tools -> Programmer select your programmer type (probably USBASP from the shopping list above) -###Customize the firmware to match your hardware and your needs +### Customize the firmware to match your hardware and your needs All customization is done by editing the ```_Config.h ``` file in the Multiprotocol Arduino project. In the Arduino IDE, click on the down arrow on the far right of the tab bar to show a list of project files (see the red circle on the screenshot below). Scroll down and select the _Config.h file. @@ -75,10 +84,9 @@ If you see something like the following, your firmware is still too big and you If there is another error carefully read it, go to the line number indicated and correct your typo. -###Flash the firmware +### Flash the firmware 1. If you have a 4in1 Multiprotocol module you can skip this step. If you've just finished to build your DIY Multiprotocol module (like v2.3d), the first step is to flash the fuses of the microcontroller. This needs to be done only once. For this purpose, click on **Tools -> Burn Bootloader** - 1. You are now ready to flash the firmware. In the Arduino IDE click **Sketch -> Upload Using Programmer**. If the output indicates that the firmware has been uploaded successfully - give yourself a pat on the back. Well done, you have successfully programmed your DIY Multiprotocol module. You can already go to the final step [Setting up your Transmitter](TransmitterSetup.md) and begin to fly!!!! But don't forget to visit the next topic [Advanced settings](#AdvancedSettings) which has some extra steps needed to use your module at his full potential. diff --git a/docs/Compiling_STM32.md b/docs/Compiling_STM32.md index 2c73cc1..958fb4e 100644 --- a/docs/Compiling_STM32.md +++ b/docs/Compiling_STM32.md @@ -7,32 +7,26 @@ Multiprotocol source can be compiled using the Arduino IDE using STM32 Core (Map On all modules with STM32F103 microcontroller, the program flash memory on the microcontroller is large enough to accommodate all the protocols. You do not have to make choices on which protocols to upload. Also, it is likely that you used the Banggood 4-in-1 RF module and you will therefore have access to all the RF modules.Now for programmng multimodule with STM32 chip you have 2 options presented below. 1. Compiling and flashing in Arduino IDE. - 1. Flashing precompiled binaries from [here](https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/releases) - - If using one of these TX with multimodule like Turnigy 9X,9XR,9X+ the binary file for flashing is **Multiprotocol_V1.X.X_STM32.bin**. - - If using TARANIS TX the binary file is **Multiprotocol_V1.X.X_STM32_INV.bin** Flashing precompiled **binaries** is done very simple with the cable setup presented below and an utility(GUI) **ST Flash Loader Demonstrator.** +## Compiling source and flashing in Arduino. - -##Compiling source and flashing in Arduino. - -###Install the Arduino IDE and the Multiprotocol project +### Install the Arduino IDE and the Multiprotocol project 1. Download the Arduino IDE. The currently supported Arduino version is 1.6.11 available for [Windows]( https://www.arduino.cc/download_handler.php?f=/arduino-1.6.12-windows.exe) and [Mac OSX](http://arduino.cc/download_handler.php?f=/arduino-1.6.12-macosx.zip) 1. It is recommended to upgrade Java to the [latest version](https://www.java.com/en/download/) 1. Download the [STM32 Core](https://github.com/rogerclarkmelbourne/Arduino_STM32/archive/master.zip) and copy the Arduino_STM32 folder to: - OSX: ```Arduino.app/Contents/Java/hardware``` (you can open Arduino.app by Ctl Clicking on Arduino.app and selecting "Show Package Contents") - Windows: ```C:\Program Files (x86)\Arduino\hardware``` - Make sure the folder tree structure is like this .....\hardware\Arduino_STM32\.....and **NOT** ...... \hardware\Arduino_STM32-master\Arduino_STM32-master\......So move the folders /rename accordingly. - 1. Download the zip file with the Multiprotocol module source code from [here](https://github.com/pascallanger/DIY-Multiprotocol-TX-Module) 1. Unzip and copy the source code folder ```Multiprotocol``` to a folder of your choosing 1. Click on the ```Multiprotocol.ino file``` in the ```Multiprotocol``` folder and the Arduino environment should appear and the Multiprotocol project will be loaded. -###Prepare the Arduino IDE: +### Prepare the Arduino IDE: 1. In order to compile successfully you need also to modify a maple library file. In ```....\hardware\Arduino_STM32\STM32F1\cores\maple\libmaple\usart_f1.c``` comment out the 2 functions as shown below. This is required to have low-level access to the USART interrupt. @@ -50,7 +44,6 @@ Flashing precompiled **binaries** is done very simple with the cable setup prese **}** ***/** - 1. Run the IDE, and on the **Tools** menu, select **Board** and then **Boards manager**. Click on the Arduino DUE (32 Bits ARM-Cortex M3) from the list of available boards. You must do this step, it installs the arm-none-eabi-g++ toolchain! 1. Close and reopen the Arduino IDE and load the Multiprotocol project. 1. In arduino IDE under the **Tools** -> **Board:** select the **Generic STM32F103C series** board @@ -63,7 +56,7 @@ There are three options for flashing the firmware. But We will present here only The first (and strongly recommended) is flashing it while it is plugged into and powered by the transmitter.The second is preparing the board for flashing with a USB cable. The second method is definitely the easiest in the long-term, but it does require the USB bord and setting up the bootloader on the STM32 MCU. -####Option 1: Flashing with Tx power(highly recommended) +#### Option 1: Flashing with Tx power(highly recommended) 1. Put the module in the Tx 1. Place a jumper over the BOOT0 pins.Skip this one if you made your own cable for flashing ,see below. @@ -71,7 +64,6 @@ The second method is definitely the easiest in the long-term, but it does requi - Module RX pin to FTDI TX pin - Module TX pin to FTDI Rx pin - Module GND to FTDI GND - 1. In arduino IDE under the **Tools** -> **Board:** check that you have selected the **Generic STM32F103C series** board 1. Under **Tools** -> **Upload Method:** select **Serial** 1. Click "Upload" and the sketch will be uploaded normally. This is valid for all arduino versions. @@ -80,16 +72,15 @@ The second method is definitely the easiest in the long-term, but it does requi If you have the module inside a box and to be inserted in TX bay, you may build a flashing cable like in the picture below. You can attach and solder a 5 pin header female and top outside the box.**ALways insert first the USB serial device in USB port , and TX start after.** -[] + See below my module for reference -[] + -####Option 2: Flashing with USB cable. +#### Option 2: Flashing with USB cable. This method use USB connector on the STM32 V1.0 board or on the maple clone board. - 1. Install first maple USB driver by running the batch file found in Arduino STM32 package folder "..\hardware\Arduino_STM32\drivers\win\install_drivers.bat" 1. Download the free STM32 flash loader demonstrator from [ST.com](http://www.st.com/en/development-tools/flasher-stm32.html) and using a USB-TTL device (like FTDI cable) flash the STM32duino bootloader available from Roger Clark's great STM32 site [here](https://github.com/rogerclarkmelbourne/STM32duino-bootloader/tree/master/STM32F1/binaries) .Use bootloader **generic_boot20_pa1.bin** 1. Open Arduino IDE,browse to multiprotocol folder,load the sketch multiprotocol.ino. diff --git a/docs/Models.md b/docs/Models.md index ea645ca..59d15ba 100644 --- a/docs/Models.md +++ b/docs/Models.md @@ -1,19 +1,23 @@ -#Model Setup +# Model Setup This is the page to document model or receiver specific setup instructions. The Deviation project (on which this project was based) have a useful list of models [here](http://www.deviationtx.com/wiki/supported_models). -#Syma X5C +# Syma X5C -##Channel Map + +## Channel Map CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 ---|---|---|---|---|---|---|--- A|E|T|R|FLIP|RATES|PICTURE|VIDEO -##Binding + +## Binding There are no special binding instructions. The model powers up in Autobind mode and expects the bind sequence from the transmitter within the first 4-5 seconds. -##Tx Setup + +## Tx Setup A basic 4-channel setup works perfectly, but some improvements are possible: -###Setting up a switch to Flip + +### Setting up a switch to Flip 1. Choose your "Rates" switch - typically the momentary TRN switch 1. In the Mixer create an entry for CH5 @@ -21,7 +25,7 @@ A basic 4-channel setup works perfectly, but some improvements are possible: - er9X: Source: sTRN, Weight 100 (or whatever switch you selected) - OpenTx: Source: SH, Weight 200 (or whatever switch you selected) -###Setting up a swich for high rates +### Setting up a swich for high rates 1. Choose your "Rates" switch 1. In the Mixer create an entry for CH6 @@ -31,7 +35,7 @@ A basic 4-channel setup works perfectly, but some improvements are possible: When the switch is in the rear position the rates will be standard, when the switch is forward rates will be high. There is no need to move the throttle stick to the full up and full down position as with the standard controller. -###Setting up Idle-up +### Setting up Idle-up One of the most annoying functions on the Syma X5C is that the motors stop when the throttle is pulled back. This can be fixed by implmenting Idle-up on the transmitter (think of this as a very simple version of the Betaflight "Air Mode"). Idle up will ensure that even when the throttle is all the way down, a minimum command is passed to the motor to keep them spinning and to activate the stabilization. **To do this**: @@ -41,49 +45,57 @@ One of the most annoying functions on the Syma X5C is that the motors stop when 1. When you want to fly in "idle-up" mode flick the switch and your stabilization will always be active. 1. Remeber to switch off idle-up as soon as the quad lands (or crashes - to avoid damage to the motors) -#Inductrix (Horizon Hobby) +# Inductrix (Horizon Hobby) -##Binding +## Binding For telemetry enabled modules, you should just let the remote autodetect the settings. Otherwise choose DSMX 22ms with 6ch or 7ch. To bind the model, keep the transmitter off, power on the Inductrix. Wait until it flashes fast and then power up the Tx and use Bind. -##Tx Setup +## Tx Setup Remember that 100% on your transmitter using the MULTI-Module corresponds to 125% on the DSM receiver side. On some functions sending 100% will confuse the model. Conversely 80% on your Tx is interpreted to be 100% at the model. Consider this when implementing the suggestions below. -###Throttle + +### Throttle For Inductrix FPV you might need to adjust the lower end of throttle to be a higher than default, otherwise motors will be spinning on minimal throttle. One way to do this is to set the throttle to 80% output (100% of DSM output) and then to enable the **Throttle Idle Trim Only** under the Model Setup menu. See image below: + -###Acro and Level Mode + +### Acro and Level Mode Setup channel 6 with a momemtary button or switch (e.g. SH on the Taranis) and use that switch to switch between modes. Set the output to somewhere between 40% to 60% for best results. An addition consideration when flying in Acro mode is to reduce stick sensitivity and to add some expo. The screens below show one way of doing this. Customize to your needs. -####Inputs Screen +#### Inputs Screen The follwing INPUTS screen shows one potential setup to introduce expo for Acro mode. The activation of the expo on Roll, Pitch and Yaw is when the SG switch is not in the back position. Add to taste. + -####Aileron Rates attached to Switch !SG-up +#### Aileron Rates attached to Switch !SG-up The next screen shows and example of how the expo (50%) was set up on the stick input and how it is activated by !SG-up: + -####Mixer Menu +#### Mixer Menu The next screen shows the mixer menu with the mode change on momentary switch SH and High-Low rates on switch SC: + # Cheerson CX-20 / Quanum Nova -##Channel Map + +## Channel Map + CH1|CH2|CH3|CH4|CH5|CH6|CH7 ---|---|---|---|---|---|--- A|E|T|R|MODE|AUX1|AUX2 -##Binding +## Binding The Rx powers up in binding mode so the transmitter should be set to autobind. If the Tx signal is lost due to power-off or going out of range the Rx will not re-bind, and requires power-cycling before it will bind again. -##Tx Setup +## Tx Setup AETR are simple +100% mixes. Note that the model expects Elevator (CH2) to be reversed, which is handled in the module firmware, so no need to reverse it on the Tx. -###Flight modes +### Flight modes CH5 is used to transmit the flight mode to the APM flight controller by setting the output to a value in a pre-defined range. The original Tx uses a 3-pos switch (SWA) and a 2-pos switch (SWB) to achieve six different combinations, but only five are used - with SWA at 0, 1500 is sent when SWB is at 0 and 1, leaving flight mode 3 unused. However, in the stock CX-20 flight controller settings, both flight mode 3 and 4 are set to the same flight mode, meaning we can configure our new Tx settings to send a value for mode 3 without changing the standard flight mode behaviour. Afterwards, you can optionally use Mission Planner to assign a new flight mode to mode 3 or mode 4, or reconfigure them altogether. The values, modes, and switch positions for the stock Tx are: @@ -113,7 +125,7 @@ One easy way to acheive this is to configure six logical switches mapped to two To simply map the old Tx modes to the new Tx using the same switch positions, use the following configuration. The stock SWA switch is replaced with the ID0/1/2 switch, SWB is replaced with the AIL D/R switch. -####Logical switches: +#### Logical switches: Switch|Function|V1|V2 ---|---|---|--- @@ -124,7 +136,7 @@ L. Switch 4|AND|ID0|AIL L. Switch 5|AND|ID1|AIL L. Switch 6|AND|ID1|!AIL -####Flight modes (using CX-20 names): +#### light modes (using CX-20 names): Mode|Name|Switch ---|---|--- @@ -135,7 +147,7 @@ Mode|Name|Switch 5|DirLock|L5 6|Stable|L6 -####Mixer setup: +#### Mixer setup: Channel|Weight|Source|Switch|Multiplex ---|---|---|---|--- @@ -158,7 +170,7 @@ Channel|Weight|Source|Multiplex CH6|+100%|P1|ADD CH7|+100%|P3|ADD -##Full Mixer Setup +## Full Mixer Setup Channel|Source|Weight|Switch|Multiplex ---|---|---|---|--- diff --git a/docs/Troubleshooting.md b/docs/Troubleshooting.md index 2420733..0e9f5dd 100644 --- a/docs/Troubleshooting.md +++ b/docs/Troubleshooting.md @@ -1,11 +1,14 @@ # Troubleshooting -##LED status -###Green LED +## LED status + +### Green LED + - Off: no power to the module - On: module is powered up -###Red LED (bind LED) +### Red LED (bind LED) + - Off: program not running or a protocol selected with the associated module not installed - Flash(on=0.05s,off=1s): invalid protocol selected (excluded from compilation or invalid protocol number) - Inverted Flash(on=1s,off=0.1s): module is waiting for a bind event (Bind from channel or Bind in radio GUI) to launch the protocol in bind mode @@ -14,19 +17,23 @@ - Slower blink(on=1s,off=1s): PPM has been selected but no valid signal is being seen on the PPM pin. - On: Module is in normal operation mode (transmitting control signals). -##Protocol selection -###Input Mode - PPM +## Protocol selection + +### Input Mode - PPM + - The protocol/mode selection must be done before the power is applied to the module - Often the signal is not sent to the module until the transmitter has performed safety checks (like switch and throttle position settings) - Check that at least one of the protocol selection pins is connected to GND. - Some radios have an open collector output (Futaba, Graupner...), in this case add a 4.7K resistor between PPM and BATT. -###Input Mode - Serial +### Input Mode - Serial + - Make sure you have done the serial mods as indicated in the [hardware page for your board] (Hardware.md). - Protocol selection dial must be in the 0 position or leave all 4 selection pins unconnected. - Often the signal is not sent to the module until the transmitter has performed safety checks (like switch and throttle position settings) -##Bind +## Bind + Make sure to follow this procedure: press the bind button, apply power and then release after the red LED starts flashing. The LED should be blinking fast indicating a bind status and then fixed on when the bind period is over. It's normal that the LED turns off when you press the bind button, this behavior is not controlled by the Atmega328. For serial, the preffered method is to bind via the GUI protocol page. @@ -40,6 +47,7 @@ FrSky & SFHSS bind issues are ususally due to Option=fine frequency tuning not s - set the value to half way between min and max. ##Report issues + You can report your problem using the [GitHub issue](https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/issues) system or go to the [Main thread on RCGROUPS](http://www.rcgroups.com/forums/showthread.php?t=2165676) to ask your question. Please provide the following information: - Multiprotocol code version From a7b914b84e3fc6aa37aba53b7806de84b0071f6e Mon Sep 17 00:00:00 2001 From: LapinFou Date: Tue, 18 Apr 2017 18:24:20 +0200 Subject: [PATCH 031/121] Fixed more typos. --- Protocols_Details.md | 5 ++--- docs/Advanced_Topics.md | 17 +++++++++-------- docs/Compiling.md | 3 +++ docs/Models.md | 8 ++++---- docs/Troubleshooting.md | 2 +- 5 files changed, 19 insertions(+), 16 deletions(-) diff --git a/Protocols_Details.md b/Protocols_Details.md index 6f20fe6..7925350 100644 --- a/Protocols_Details.md +++ b/Protocols_Details.md @@ -37,7 +37,6 @@ Dial|Protocol|Sub_protocol|RX Num|Power|Auto Bind|Option|RF Module 1. The transmitter will automatically initiate a bind sequence on power up. This is for models where the receiver expects to rebind every time it is powered up. In these protocols you do not need to press the bind button at power up to bind, it will be done automatically. 2. Enable Bind from channel feature: - * Bind from channel can be globally enabled/disabled in _config.h using ENABLE_BIND_CH. * Bind from channel can be locally enabled/disabled by setting Autobind to Y/N per model for serial or per dial switch number for ppm. * Bind channel can be choosen on any channel between 5 and 16 using BIND_CH in _config.h. @@ -45,13 +44,13 @@ Dial|Protocol|Sub_protocol|RX Num|Power|Auto Bind|Option|RF Module - Autobind = Y - Throttle = LOW (<-95%) - Bind channel is going from -100% to +100% -* Additional notes: + + * Additional notes: - It's recommended to combine Throttle cut with another button to drive the bind channel. This will prevent to launch a bind while flying... - Bind channel does not have to be assigned to a free channel. Since it only acts when Throttle is Low (and throttle cut active), it could be used on the same channel as Flip for example since you are not going to flip your model when Throttle is low... Same goes for RTH and such other features. - Using channel 16 for the bind channel seems the most relevant as only one protocol so far is using 16 channels which is FrSkyX. But even on FrSkyX this feature won't have any impact since there is NO valid reason to have Autobind set to Y for such a protocol. -*** # A7105 RF Module ## FLYSKY - *1* diff --git a/docs/Advanced_Topics.md b/docs/Advanced_Topics.md index 67f6c34..1de385b 100644 --- a/docs/Advanced_Topics.md +++ b/docs/Advanced_Topics.md @@ -34,18 +34,19 @@ The key difference of this method is that the 3.3V FTDI cable must also provide 1. Remove the module from the transmitter bay 1. Set BOOT0 jumper Skip this step if you made your own cable. 1. Set the 3.3V jumper. -1. Connect your 3.3V FTDI cable (USB - TTL serial) to Multiprotocol serial port (RX,TX,GND,5V). Connect the pins as follows: - - Module RX pin to FTDI TX pin - - Module TX pin to FTDI Rx pin - - Module GND to FTDI GND - - Module 5V to FTDI 3.3V FTDI power supply. +1. Connect your 3.3V FTDI cable (USB - TTL serial) to Multiprotocol serial port (RX,TX,GND,5V). +Connect the pins as follows: +..* Module RX pin to FTDI TX pin +..* Module TX pin to FTDI Rx pin +..* Module GND to FTDI GND +..* Module 5V to FTDI 3.3V FTDI power supply 1. In arduino IDE under the **Tools** -> **Board:** check that you have selected the **Generic STM32F103C series** board 1. Under **Tools** -> **Upload Method:** select **Serial**. 1. Click "Upload" and the sketch will be uploaded normally. 1. Once the firmware has uploaded: - - Remove the 3.3V jumper!!!! - - Remove the BOOT0 jumper - - Check that you removed the 3.3V jumper +..* Remove the 3.3V jumper!!!! +..* Remove the BOOT0 jumper +..* Check that you removed the 3.3V jumper 1. Insert the module into the transmitter bay diff --git a/docs/Compiling.md b/docs/Compiling.md index 07dc80c..ff4c103 100644 --- a/docs/Compiling.md +++ b/docs/Compiling.md @@ -16,13 +16,16 @@ The procedure below will guide you through all the steps to upload successfully ### Material you need to upload the firmware 1. USBASP programmer supporting 3.3V: + [(example aliexpress link)](https://www.aliexpress.com/item/USBasp-USB-ISP-3-3V-5V-AVR-Programmer-USB-ATMEGA8-ATMEGA128-New-10PIN-Wire-Support/2036402518.html?spm=2114.30010308.8.10.jIbHzs) There are reports that some of the cheap programmers are not safe to use with 3.3V units, usually the black PCB versions are ok. 1. 10pin to 6pin adapter: + [(example ebay link)](http://www.ebay.fr/itm/10-Pin-a-6-Pin-Carte-Adaptateur-M-F-pour-AVRISP-USBASP-STK500-Noir-Bleu-WT-/291862396761?hash=item43f45abf59:g:gXsAAOSwMgdXyGnh) 1. 6 pin header like this one: + [(example Digi-Key link)](http://www.digikey.com/products/en?keywords=3M%20961206-6404-AR) The 6 Pin header needs to be solder on the board like indicated by the red rectangle: diff --git a/docs/Models.md b/docs/Models.md index 59d15ba..f1209a0 100644 --- a/docs/Models.md +++ b/docs/Models.md @@ -165,10 +165,10 @@ CH6 and CH7 can be assigned to switches or pots to provide additionaly functiona Replicating the stock setup of two pots, you would assign: -Channel|Weight|Source|Multiplex ----|---|---|---|--- -CH6|+100%|P1|ADD -CH7|+100%|P3|ADD +Channel | Weight | Source | Multiplex +--- | --- | --- | --- | --- +CH6 | +100% | P1 | ADD +CH7 | +100% | P3 | ADD ## Full Mixer Setup diff --git a/docs/Troubleshooting.md b/docs/Troubleshooting.md index 0e9f5dd..73c5c39 100644 --- a/docs/Troubleshooting.md +++ b/docs/Troubleshooting.md @@ -46,7 +46,7 @@ FrSky & SFHSS bind issues are ususally due to Option=fine frequency tuning not s - find the values min/max where the RX loses connection. In serial mode you can change the value and see the effect live. - set the value to half way between min and max. -##Report issues +## Report issues You can report your problem using the [GitHub issue](https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/issues) system or go to the [Main thread on RCGROUPS](http://www.rcgroups.com/forums/showthread.php?t=2165676) to ask your question. Please provide the following information: From 6894228a634b67b87581cfdfc13361a8a29daedd Mon Sep 17 00:00:00 2001 From: LapinFou Date: Tue, 18 Apr 2017 18:28:18 +0200 Subject: [PATCH 032/121] Fixed typo. --- Protocols_Details.md | 22 +++++++++++----------- docs/Advanced_Topics.md | 14 +++++++------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Protocols_Details.md b/Protocols_Details.md index 7925350..b273322 100644 --- a/Protocols_Details.md +++ b/Protocols_Details.md @@ -37,18 +37,18 @@ Dial|Protocol|Sub_protocol|RX Num|Power|Auto Bind|Option|RF Module 1. The transmitter will automatically initiate a bind sequence on power up. This is for models where the receiver expects to rebind every time it is powered up. In these protocols you do not need to press the bind button at power up to bind, it will be done automatically. 2. Enable Bind from channel feature: -* Bind from channel can be globally enabled/disabled in _config.h using ENABLE_BIND_CH. -* Bind from channel can be locally enabled/disabled by setting Autobind to Y/N per model for serial or per dial switch number for ppm. -* Bind channel can be choosen on any channel between 5 and 16 using BIND_CH in _config.h. -* Bind will only happen if all these elements are happening at the same time: - - Autobind = Y - - Throttle = LOW (<-95%) - - Bind channel is going from -100% to +100% + * Bind from channel can be globally enabled/disabled in _config.h using ENABLE_BIND_CH. + * Bind from channel can be locally enabled/disabled by setting Autobind to Y/N per model for serial or per dial switch number for ppm. + * Bind channel can be choosen on any channel between 5 and 16 using BIND_CH in _config.h. + * Bind will only happen if all these elements are happening at the same time: + - Autobind = Y + - Throttle = LOW (<-95%) + - Bind channel is going from -100% to +100% - * Additional notes: - - It's recommended to combine Throttle cut with another button to drive the bind channel. This will prevent to launch a bind while flying... - - Bind channel does not have to be assigned to a free channel. Since it only acts when Throttle is Low (and throttle cut active), it could be used on the same channel as Flip for example since you are not going to flip your model when Throttle is low... Same goes for RTH and such other features. - - Using channel 16 for the bind channel seems the most relevant as only one protocol so far is using 16 channels which is FrSkyX. But even on FrSkyX this feature won't have any impact since there is NO valid reason to have Autobind set to Y for such a protocol. +* Additional notes: + - It's recommended to combine Throttle cut with another button to drive the bind channel. This will prevent to launch a bind while flying... + - Bind channel does not have to be assigned to a free channel. Since it only acts when Throttle is Low (and throttle cut active), it could be used on the same channel as Flip for example since you are not going to flip your model when Throttle is low... Same goes for RTH and such other features. + - Using channel 16 for the bind channel seems the most relevant as only one protocol so far is using 16 channels which is FrSkyX. But even on FrSkyX this feature won't have any impact since there is NO valid reason to have Autobind set to Y for such a protocol. # A7105 RF Module diff --git a/docs/Advanced_Topics.md b/docs/Advanced_Topics.md index 1de385b..2a77007 100644 --- a/docs/Advanced_Topics.md +++ b/docs/Advanced_Topics.md @@ -36,17 +36,17 @@ The key difference of this method is that the 3.3V FTDI cable must also provide 1. Set the 3.3V jumper. 1. Connect your 3.3V FTDI cable (USB - TTL serial) to Multiprotocol serial port (RX,TX,GND,5V). Connect the pins as follows: -..* Module RX pin to FTDI TX pin -..* Module TX pin to FTDI Rx pin -..* Module GND to FTDI GND -..* Module 5V to FTDI 3.3V FTDI power supply + * Module RX pin to FTDI TX pin + * Module TX pin to FTDI Rx pin + * Module GND to FTDI GND + * Module 5V to FTDI 3.3V FTDI power supply 1. In arduino IDE under the **Tools** -> **Board:** check that you have selected the **Generic STM32F103C series** board 1. Under **Tools** -> **Upload Method:** select **Serial**. 1. Click "Upload" and the sketch will be uploaded normally. 1. Once the firmware has uploaded: -..* Remove the 3.3V jumper!!!! -..* Remove the BOOT0 jumper -..* Check that you removed the 3.3V jumper + * Remove the 3.3V jumper!!!! + * Remove the BOOT0 jumper + * Check that you removed the 3.3V jumper 1. Insert the module into the transmitter bay From 3ac59a5bc07e9d3023c5b7e836db65d1f45dada4 Mon Sep 17 00:00:00 2001 From: LapinFou Date: Tue, 18 Apr 2017 18:32:49 +0200 Subject: [PATCH 033/121] Typo again... =) --- docs/Compiling.md | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/docs/Compiling.md b/docs/Compiling.md index ff4c103..a7f5d68 100644 --- a/docs/Compiling.md +++ b/docs/Compiling.md @@ -17,16 +17,22 @@ The procedure below will guide you through all the steps to upload successfully 1. USBASP programmer supporting 3.3V: - [(example aliexpress link)](https://www.aliexpress.com/item/USBasp-USB-ISP-3-3V-5V-AVR-Programmer-USB-ATMEGA8-ATMEGA128-New-10PIN-Wire-Support/2036402518.html?spm=2114.30010308.8.10.jIbHzs) + + +[(example aliexpress link)](https://www.aliexpress.com/item/USBasp-USB-ISP-3-3V-5V-AVR-Programmer-USB-ATMEGA8-ATMEGA128-New-10PIN-Wire-Support/2036402518.html?spm=2114.30010308.8.10.jIbHzs) There are reports that some of the cheap programmers are not safe to use with 3.3V units, usually the black PCB versions are ok. 1. 10pin to 6pin adapter: - [(example ebay link)](http://www.ebay.fr/itm/10-Pin-a-6-Pin-Carte-Adaptateur-M-F-pour-AVRISP-USBASP-STK500-Noir-Bleu-WT-/291862396761?hash=item43f45abf59:g:gXsAAOSwMgdXyGnh) + + +[(example ebay link)](http://www.ebay.fr/itm/10-Pin-a-6-Pin-Carte-Adaptateur-M-F-pour-AVRISP-USBASP-STK500-Noir-Bleu-WT-/291862396761?hash=item43f45abf59:g:gXsAAOSwMgdXyGnh) 1. 6 pin header like this one: - [(example Digi-Key link)](http://www.digikey.com/products/en?keywords=3M%20961206-6404-AR) + + +[(example Digi-Key link)](http://www.digikey.com/products/en?keywords=3M%20961206-6404-AR) The 6 Pin header needs to be solder on the board like indicated by the red rectangle: * Banggood readymade 4-in-1 module: @@ -41,17 +47,24 @@ The 6 Pin header needs to be solder on the board like indicated by the red recta ### Connect the programmer 1. Before you connect the programmer make sure that you have selected the 3.3V mode and not 5V. The RF Modules are not 5V tolerant and you will break them with 5V. On most programmers this is done by moving a jumper. + + 1. Please re-read item 1. above before going on. 1. Turn the rotary switch on the DIY Multiprotocol module to the 0 position. If you do not have a switch for Serial mode only then it is the same as being in the 0 position. The upload will not work if the switch is in any other position. 1. Connect the 6-pin programming connector to the 6-pin ASP IVR connector on the DIY Multiprotocol board. Be sure to match the ground pin of the programmer connector to the ground pin on the board. The images below indicates the pin layout and the location of the ground pin on the board: * Banggood readymade 4-in-1 module: + + * DIY Mulitprotocol modules (like the 2.3d board): + + * Arduino Pro Mini module: + You are now ready to plug in the USB programmer to the computer @@ -117,7 +130,9 @@ First, we need to append some text to the Arduino file boards.txt. #### On Windows 1. Close the Arduino IDE 1. Search Windows for the application WordPad (DO NOT USE Notepad). Right click on WordPad and select "Run as Administrator": + + 1. Open the file ```boards.txt``` located in this folder ```C:\Program Files(x86)\Arduino\hardware\arduino\avr ``` or the equivalent if you have installed Aduino in a different directory. 1. Append the following text into the end of the file and save it: From 709c5cbd71ae08e0dcf59c5d6d81d8061ac4aeae Mon Sep 17 00:00:00 2001 From: LapinFou Date: Tue, 18 Apr 2017 18:34:55 +0200 Subject: [PATCH 034/121] Typo !! --- docs/Compiling.md | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/docs/Compiling.md b/docs/Compiling.md index a7f5d68..f7249a0 100644 --- a/docs/Compiling.md +++ b/docs/Compiling.md @@ -16,32 +16,21 @@ The procedure below will guide you through all the steps to upload successfully ### Material you need to upload the firmware 1. USBASP programmer supporting 3.3V: - - [(example aliexpress link)](https://www.aliexpress.com/item/USBasp-USB-ISP-3-3V-5V-AVR-Programmer-USB-ATMEGA8-ATMEGA128-New-10PIN-Wire-Support/2036402518.html?spm=2114.30010308.8.10.jIbHzs) There are reports that some of the cheap programmers are not safe to use with 3.3V units, usually the black PCB versions are ok. - 1. 10pin to 6pin adapter: - - [(example ebay link)](http://www.ebay.fr/itm/10-Pin-a-6-Pin-Carte-Adaptateur-M-F-pour-AVRISP-USBASP-STK500-Noir-Bleu-WT-/291862396761?hash=item43f45abf59:g:gXsAAOSwMgdXyGnh) - 1. 6 pin header like this one: - - [(example Digi-Key link)](http://www.digikey.com/products/en?keywords=3M%20961206-6404-AR) - -The 6 Pin header needs to be solder on the board like indicated by the red rectangle: -* Banggood readymade 4-in-1 module: +1.The 6 Pin header needs to be solder on the board like indicated by the red rectangle: + * Banggood readymade 4-in-1 module: - -* DIY Mulitprotocol modules (like the 2.3d board): + * DIY Mulitprotocol modules (like the 2.3d board): - -* Arduino Pro Mini module: + * Arduino Pro Mini module: ### Connect the programmer From c949eb549156cf2c2c14ba07bba530ec292d7193 Mon Sep 17 00:00:00 2001 From: LapinFou Date: Tue, 18 Apr 2017 18:40:02 +0200 Subject: [PATCH 035/121] Test image --- docs/Compiling.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Compiling.md b/docs/Compiling.md index f7249a0..baff611 100644 --- a/docs/Compiling.md +++ b/docs/Compiling.md @@ -16,7 +16,7 @@ The procedure below will guide you through all the steps to upload successfully ### Material you need to upload the firmware 1. USBASP programmer supporting 3.3V: - +![](images/USBasp_Programmer.jpeg =200x) [(example aliexpress link)](https://www.aliexpress.com/item/USBasp-USB-ISP-3-3V-5V-AVR-Programmer-USB-ATMEGA8-ATMEGA128-New-10PIN-Wire-Support/2036402518.html?spm=2114.30010308.8.10.jIbHzs) There are reports that some of the cheap programmers are not safe to use with 3.3V units, usually the black PCB versions are ok. 1. 10pin to 6pin adapter: From 25a2689bd0045078243cb2197d6db3f0841d095b Mon Sep 17 00:00:00 2001 From: LapinFou Date: Tue, 18 Apr 2017 18:42:03 +0200 Subject: [PATCH 036/121] Test image --- docs/Compiling.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Compiling.md b/docs/Compiling.md index baff611..b60072c 100644 --- a/docs/Compiling.md +++ b/docs/Compiling.md @@ -16,7 +16,7 @@ The procedure below will guide you through all the steps to upload successfully ### Material you need to upload the firmware 1. USBASP programmer supporting 3.3V: -![](images/USBasp_Programmer.jpeg =200x) +[[images/USBasp_Programmer.jpeg]] [(example aliexpress link)](https://www.aliexpress.com/item/USBasp-USB-ISP-3-3V-5V-AVR-Programmer-USB-ATMEGA8-ATMEGA128-New-10PIN-Wire-Support/2036402518.html?spm=2114.30010308.8.10.jIbHzs) There are reports that some of the cheap programmers are not safe to use with 3.3V units, usually the black PCB versions are ok. 1. 10pin to 6pin adapter: From e81ba5596712decff831ca7e44c091b5799ae244 Mon Sep 17 00:00:00 2001 From: LapinFou Date: Tue, 18 Apr 2017 20:12:08 +0200 Subject: [PATCH 037/121] Test image --- docs/Module_Build_yourself_PCB.md | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/docs/Module_Build_yourself_PCB.md b/docs/Module_Build_yourself_PCB.md index 61735e6..b553551 100644 --- a/docs/Module_Build_yourself_PCB.md +++ b/docs/Module_Build_yourself_PCB.md @@ -1,7 +1,12 @@ +![](images/DIY_Mulitprotocol_Module_Schematic.jpeg =500x) -#DIY MULTI-module by soldering components on a PCB +BLABLABLA + +![](images/DIY_Mulitprotocol_Module_Schematic.jpeg) + +# DIY MULTI-module by soldering components on a PCB Currently the form factor of this module is designed for the JR-style module bay. Many of the popular RC transmitters use the JR-style module bay: FrSky Taranis, FlySky Th9x, Turnigy 9X/R/Pro -##What you need +## What you need First you must choose the PCB onto which to solder all the components. There are two PCB options: - ATmega (8-bit) powered PCB V2.3d supporting individual RF modules - STM32 (32-bit) powered PCB V1.0t supporting the 4-in-1 RF module @@ -14,7 +19,7 @@ The **STM32-based** board has been designed to accept the 4-in-1 RF module with -###ATmega board V2.3d +### ATmega board V2.3d 1. ATmega (8-bit) powered PCB V2.3d available from OSHPark [here](https://oshpark.com/shared_projects/Ztus1ah8). 2. Individual RF modules The modules are available here: - [CC2500](http://www.banggood.com/2_4G-500K-CC2500-Long-Range-Wireless-Transceiver-Module-p-1075492.html) for FrSkyV, FrSkyD, FrSkyX and SFHSS @@ -26,34 +31,32 @@ The **STM32-based** board has been designed to accept the 4-in-1 RF module with The schematic for the board is [here](#V23D_Schematic). Please note that is is the general schematic - there will be some minor differences (like solder jumpers) between this and the board. -###STM32 powered PCB +### STM32 powered PCB 1. The latest STM32 (32-bit) powered PCB V1.0t supporting the 4-in-1 RF module available from OSHPark [here](https://oshpark.com/shared_projects/GX51nEoH). 2. The 4-in-1 RF module is available [here](http://www.banggood.com/DIY-2_4G-CC2500-NRF24L01-A7105-CYRF6936-Multi-RF-4-IN-1-Wireless-Module-p-1046308.html) 1. The schematic and BOM for this board V1.0t and older boards are available [here](BOM_DIY_STM32 & Schematic.md). -###Common parts +### Common parts 1. A module case that fits your module like the one [here](https://www.xtremepowersystems.net/proddetail.php?prod=XPS-J1CASE) or you can 3D print your own from a selection on Thingiverse ([Example 1](http://www.thingiverse.com/thing:1852868) [Example 2](http://www.thingiverse.com/thing:1661833)). [ ](http://www.thingiverse.com/thing:1852868) For 9XR/9XR Pro, a new 3D printed module is available which makes use of the built in antenna in the handle. This means nothing is getting out of the radio back! You can find all details of this module case on [Thingiverse](http://www.thingiverse.com/thing:2050717). - - 1. A 2.4GHz antenna and pigtail -##Build instructions +## Build instructions If you got this far you already know what you are doing!! -###Common steps +### Common steps 1. Solder all the parts according to the BOM part numbering and the images for your board (see OSHPARK for the images) 1. Fit the module into the module case. This may require some careful filing or sanding of the module to ensure a nice fit. -###PPM interface +### PPM interface If you are only planning on using the PPM interface with transmitter you are ready to program the module as described in [Compiling and Programming](Compiling.md) the module. -###Enabling Serial and Telemetry interface +### Enabling Serial and Telemetry interface If you have a transmitter that can support serial communication with the board then you need to solder some jumpers. @@ -77,10 +80,13 @@ You are now ready to go over to [Compiling and Programming](Compiling.md). You are now ready to go over to [Compiling and Programming STM32](Compiling_STM32.md). -#Reference Schematic +# Reference Schematic Here is the schematic you can use to troubleshoot the module ## PCB 2.3d Schematic General module schematic (reference) + + + V2.3d Board Schematic From 5286e7f89cc5df0ed840822092e0ca6ee6cbe7aa Mon Sep 17 00:00:00 2001 From: LapinFou Date: Tue, 18 Apr 2017 20:19:35 +0200 Subject: [PATCH 038/121] Typo. --- README.md | 4 ++-- docs/Module_BG_4-in-1.md | 10 +++++----- docs/Module_Build_yourself_PCB.md | 8 -------- 3 files changed, 7 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index fe76196..8e2fcee 100644 --- a/README.md +++ b/README.md @@ -18,8 +18,8 @@ The source code is partly based on the [Deviation TX project](http://www.deviati 1. [Transmitters and serial/telemetry options](docs/Transmitters.md) 1. [Module Hardware options](docs/Hardware.md) 1. Compiling and programming the module - * [4in1/DIY Mutliprotocol module based on ATmega328](docs/Compiling.md) - * [DIY Mutliprotocol module based on STM32](docs/Compiling_STM32.md) + * [4in1/DIY Mutliprotocol module based on ATmega328](docs/Compiling.md) + * [DIY Mutliprotocol module based on STM32](docs/Compiling_STM32.md) 1. [Transmitter Setup](docs/Transmitters.md) 1. [How to for popular models](docs/Models.md) 1. [Troubleshooting](docs/Troubleshooting.md) diff --git a/docs/Module_BG_4-in-1.md b/docs/Module_BG_4-in-1.md index d3717fc..10de56e 100644 --- a/docs/Module_BG_4-in-1.md +++ b/docs/Module_BG_4-in-1.md @@ -1,7 +1,7 @@ -#4-in-1 module +# 4-in-1 module Currently the form factor of this module is designed for the JR-style module bay. Many of the popular RC transmitters use the JR-style module bay: FrSky Taranis, FlySky Th9x, Turnigy 9X/R/Pro -##What you need +## What you need A fully assembled module + case available from Banggood.com [here](http://www.banggood.com/CC2500-NRF24L01-A7105-CYRF693-4-In-1-RF-Module-With-Case-For-Futaba-JR-Frsky-Transmitter-p-1116892.html) @@ -21,9 +21,9 @@ For 9XR/9XR Pro, a new 3D printed module is available which makes use of the bui -##Different working modes +## Different working modes -###PPM mode +### PPM mode If you are only planning on using the PPM interface with your transmitter, you need to connect it as described: @@ -34,7 +34,7 @@ The same plug is available on all versions of the module with the same signal lo If you wish to add an external device reading the telemetry, you need to enable serial mode as explained in the next topics otherwise you are now ready to go over to [Compiling and Programming](Compiling.md). -###Serial mode +### Serial mode If you have a transmitter that can support serial communication with the board then you need to wire up the board appropriately. There are three versions of the module and the steps are slightly different. Check which module you have and based on the pictures below. If you purchased the module after June 2016 then it is likely that you have a V1.1 type module. If you have purchased the version with case it is likely that you have a V1.2 type module. diff --git a/docs/Module_Build_yourself_PCB.md b/docs/Module_Build_yourself_PCB.md index b553551..39197eb 100644 --- a/docs/Module_Build_yourself_PCB.md +++ b/docs/Module_Build_yourself_PCB.md @@ -1,8 +1,3 @@ -![](images/DIY_Mulitprotocol_Module_Schematic.jpeg =500x) - -BLABLABLA - -![](images/DIY_Mulitprotocol_Module_Schematic.jpeg) # DIY MULTI-module by soldering components on a PCB Currently the form factor of this module is designed for the JR-style module bay. Many of the popular RC transmitters use the JR-style module bay: FrSky Taranis, FlySky Th9x, Turnigy 9X/R/Pro @@ -84,9 +79,6 @@ You are now ready to go over to [Compiling and Programming STM32](Compiling_STM3 Here is the schematic you can use to troubleshoot the module ## PCB 2.3d Schematic General module schematic (reference) - - - V2.3d Board Schematic From 62e2a0211fbef3e7402acd8a92439d6a2c7678ef Mon Sep 17 00:00:00 2001 From: LapinFou Date: Tue, 18 Apr 2017 20:20:27 +0200 Subject: [PATCH 039/121] Fix categories. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8e2fcee..5fb560f 100644 --- a/README.md +++ b/README.md @@ -18,8 +18,8 @@ The source code is partly based on the [Deviation TX project](http://www.deviati 1. [Transmitters and serial/telemetry options](docs/Transmitters.md) 1. [Module Hardware options](docs/Hardware.md) 1. Compiling and programming the module - * [4in1/DIY Mutliprotocol module based on ATmega328](docs/Compiling.md) - * [DIY Mutliprotocol module based on STM32](docs/Compiling_STM32.md) + * [4in1/DIY Mutliprotocol module based on ATmega328](docs/Compiling.md) + * [DIY Mutliprotocol module based on STM32](docs/Compiling_STM32.md) 1. [Transmitter Setup](docs/Transmitters.md) 1. [How to for popular models](docs/Models.md) 1. [Troubleshooting](docs/Troubleshooting.md) From e51f6e1e86914cec885670fba124295b12dacccc Mon Sep 17 00:00:00 2001 From: LapinFou Date: Tue, 18 Apr 2017 20:37:40 +0200 Subject: [PATCH 040/121] More corrections. --- README.md | 9 +++------ docs/Compiling.md | 2 +- docs/Hardware.md | 2 +- docs/Module_Build_From_Scratch.md | 6 +++--- docs/Module_Build_yourself_PCB.md | 5 +++-- docs/Module_OrangeRx.md | 2 +- 6 files changed, 12 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 5fb560f..e9d210e 100644 --- a/README.md +++ b/README.md @@ -32,12 +32,9 @@ A functioning MULTI-Module consists of (see image below): 1. A host RC Tx 1. A Multiprotocol Transmitter Module (MULTI-Module) that connects to a host transmitter. This module is typically comprised of - - * A microcontroller (currently ATMega328P or STM32) that interfaces with the Tx, controls the module functions and forwards the RC commands to the RF hardware - - * One or more (but at least one) RF modules that provide the capability to communicate with RC receivers. To communicate with the receiver the RF module in the Tx must match with the RF module type in the receiver. The four most common 2.4GHz RF chips on the market are supported TI CC2500, Nordic NRF24L01, Cypress CYRF6936, and the Amiccom A7105 - - * MULTI-firmware loaded on to the microprocessor. At a high level, this firmware performs a few different functions: + * A microcontroller (currently ATMega328P or STM32) that interfaces with the Tx, controls the module functions and forwards the RC commands to the RF hardware + * One or more (but at least one) RF modules that provide the capability to communicate with RC receivers. To communicate with the receiver the RF module in the Tx must match with the RF module type in the receiver. The four most common 2.4GHz RF chips on the market are supported TI CC2500, Nordic NRF24L01, Cypress CYRF6936, and the Amiccom A7105 + * MULTI-firmware loaded on to the microprocessor. At a high level, this firmware performs a few different functions: * It interfaces with signals from the host Tx and decodes these for transmission to the model, it manages the activation of the correct hardware RF module for each protocol * It implements the unique communication protocols for each receiver/model and manages the all-important binding process with a receiver/model * In the case of some protocols (for example DSMX and FrSky) it receives and decodes the telemetry information and makes this available to the radio. diff --git a/docs/Compiling.md b/docs/Compiling.md index b60072c..f7249a0 100644 --- a/docs/Compiling.md +++ b/docs/Compiling.md @@ -16,7 +16,7 @@ The procedure below will guide you through all the steps to upload successfully ### Material you need to upload the firmware 1. USBASP programmer supporting 3.3V: -[[images/USBasp_Programmer.jpeg]] + [(example aliexpress link)](https://www.aliexpress.com/item/USBasp-USB-ISP-3-3V-5V-AVR-Programmer-USB-ATMEGA8-ATMEGA128-New-10PIN-Wire-Support/2036402518.html?spm=2114.30010308.8.10.jIbHzs) There are reports that some of the cheap programmers are not safe to use with 3.3V units, usually the black PCB versions are ok. 1. 10pin to 6pin adapter: diff --git a/docs/Hardware.md b/docs/Hardware.md index 669f787..4748bfb 100644 --- a/docs/Hardware.md +++ b/docs/Hardware.md @@ -2,7 +2,7 @@ The choice of **Multiprotocol Transmitter Module (MULTI-Module)** hardware is the single biggest choice you will make. Due to the growing popularity of this project the number of hardware choices is growing almost monthly. -There are currently four common hardware options. They are (click on the pictures for more info): +There are currently four common hardware options. They are (**click on the pictures for more info**): 1. A ready-made 4-in-1 MULTI-Module which integrates the microcontroller with all four supported RF modules and a hardware antenna switcher. [](Module_BG_4-in-1.md) diff --git a/docs/Module_Build_From_Scratch.md b/docs/Module_Build_From_Scratch.md index a447c9f..86d8ea2 100644 --- a/docs/Module_Build_From_Scratch.md +++ b/docs/Module_Build_From_Scratch.md @@ -1,4 +1,4 @@ -#Build from stratch +# Build from stratch If you can help to fully document this page, or just add additional detail please let us know on the rcgroups [forum](http://www.rcgroups.com/forums/showthread.php?t=2165676). @@ -14,9 +14,9 @@ A module case that fits your receiver like the one [here](https://www.xtremepowe For 9XR/9XR Pro, a new 3D printed module is available which makes use of the built in antenna in the handle. This means nothing is getting out of the radio back. You can find all details of this module case on [Thingiverse](http://www.thingiverse.com/thing:2050717). -##Reference Schematic +## Reference Schematic Here is the schematic you can use to troubleshoot the module -##Compiling and programming +## Compiling and programming Follow the instruction on the [Compiling and programming page](Compiling.md) diff --git a/docs/Module_Build_yourself_PCB.md b/docs/Module_Build_yourself_PCB.md index 39197eb..ed2bd08 100644 --- a/docs/Module_Build_yourself_PCB.md +++ b/docs/Module_Build_yourself_PCB.md @@ -1,10 +1,11 @@ # DIY MULTI-module by soldering components on a PCB Currently the form factor of this module is designed for the JR-style module bay. Many of the popular RC transmitters use the JR-style module bay: FrSky Taranis, FlySky Th9x, Turnigy 9X/R/Pro + ## What you need First you must choose the PCB onto which to solder all the components. There are two PCB options: - - ATmega (8-bit) powered PCB V2.3d supporting individual RF modules - - STM32 (32-bit) powered PCB V1.0t supporting the 4-in-1 RF module +- ATmega (8-bit) powered PCB V2.3d supporting individual RF modules +- STM32 (32-bit) powered PCB V1.0t supporting the 4-in-1 RF module The **ATmega-based board** has been designed to accept individual RF modules. This way you can select just the module or modules you want. The downside is that each module requires its own antenna. It can become cumbersome with 4 antennas protruding from the module. It is possible to soder the 4-in-1 module to the PCB using thin insulated wire. This 4-in-1 module requires only one antenna. Finally, the Atmega board has a 32KB flash memory. This is big enough to accommodate more than 15 protocols, but it cannot accommodate all the available protocols. diff --git a/docs/Module_OrangeRx.md b/docs/Module_OrangeRx.md index 6cdd2f0..ee03fe8 100644 --- a/docs/Module_OrangeRx.md +++ b/docs/Module_OrangeRx.md @@ -1,4 +1,4 @@ -#OrangeRx Transmitter module +# OrangeRx Transmitter module The OrangeRx transmitter module uses an Atmel XMega MCU. This requires a PDI programmer to flash firmware, the USBASP programmers do not work. From b08bcf041bac8253557aca7c1f4a31ce750bffa7 Mon Sep 17 00:00:00 2001 From: LapinFou Date: Wed, 19 Apr 2017 09:53:15 +0200 Subject: [PATCH 041/121] Fixed compiling page. --- docs/Compiling.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/Compiling.md b/docs/Compiling.md index f7249a0..7800625 100644 --- a/docs/Compiling.md +++ b/docs/Compiling.md @@ -17,20 +17,20 @@ The procedure below will guide you through all the steps to upload successfully 1. USBASP programmer supporting 3.3V: -[(example aliexpress link)](https://www.aliexpress.com/item/USBasp-USB-ISP-3-3V-5V-AVR-Programmer-USB-ATMEGA8-ATMEGA128-New-10PIN-Wire-Support/2036402518.html?spm=2114.30010308.8.10.jIbHzs) +[Example aliexpress link](https://www.aliexpress.com/item/USBasp-USB-ISP-3-3V-5V-AVR-Programmer-USB-ATMEGA8-ATMEGA128-New-10PIN-Wire-Support/2036402518.html?spm=2114.30010308.8.10.jIbHzs) There are reports that some of the cheap programmers are not safe to use with 3.3V units, usually the black PCB versions are ok. 1. 10pin to 6pin adapter: -[(example ebay link)](http://www.ebay.fr/itm/10-Pin-a-6-Pin-Carte-Adaptateur-M-F-pour-AVRISP-USBASP-STK500-Noir-Bleu-WT-/291862396761?hash=item43f45abf59:g:gXsAAOSwMgdXyGnh) +[Example ebay link](http://www.ebay.fr/itm/10-Pin-a-6-Pin-Carte-Adaptateur-M-F-pour-AVRISP-USBASP-STK500-Noir-Bleu-WT-/291862396761?hash=item43f45abf59:g:gXsAAOSwMgdXyGnh) 1. 6 pin header like this one: -[(example Digi-Key link)](http://www.digikey.com/products/en?keywords=3M%20961206-6404-AR) +[Example Digi-Key link](http://www.digikey.com/products/en?keywords=3M%20961206-6404-AR) 1.The 6 Pin header needs to be solder on the board like indicated by the red rectangle: - * Banggood readymade 4-in-1 module: + - Banggood readymade 4-in-1 module: - * DIY Mulitprotocol modules (like the 2.3d board): + - DIY Mulitprotocol modules (like the 2.3d board): - * Arduino Pro Mini module: + - Arduino Pro Mini module: ### Connect the programmer From 154f61fb11caf60f36dc6ccc42271e68327b27a7 Mon Sep 17 00:00:00 2001 From: LapinFou Date: Wed, 19 Apr 2017 09:56:08 +0200 Subject: [PATCH 042/121] Fixed "Material you need to upload the firmware" section. --- docs/Compiling.md | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/docs/Compiling.md b/docs/Compiling.md index 7800625..d4c2c45 100644 --- a/docs/Compiling.md +++ b/docs/Compiling.md @@ -15,23 +15,14 @@ The procedure below will guide you through all the steps to upload successfully ### Material you need to upload the firmware -1. USBASP programmer supporting 3.3V: - -[Example aliexpress link](https://www.aliexpress.com/item/USBasp-USB-ISP-3-3V-5V-AVR-Programmer-USB-ATMEGA8-ATMEGA128-New-10PIN-Wire-Support/2036402518.html?spm=2114.30010308.8.10.jIbHzs) +1. USBASP programmer supporting 3.3V: [Example aliexpress link](https://www.aliexpress.com/item/USBasp-USB-ISP-3-3V-5V-AVR-Programmer-USB-ATMEGA8-ATMEGA128-New-10PIN-Wire-Support/2036402518.html?spm=2114.30010308.8.10.jIbHzs) There are reports that some of the cheap programmers are not safe to use with 3.3V units, usually the black PCB versions are ok. -1. 10pin to 6pin adapter: - -[Example ebay link](http://www.ebay.fr/itm/10-Pin-a-6-Pin-Carte-Adaptateur-M-F-pour-AVRISP-USBASP-STK500-Noir-Bleu-WT-/291862396761?hash=item43f45abf59:g:gXsAAOSwMgdXyGnh) -1. 6 pin header like this one: - -[Example Digi-Key link](http://www.digikey.com/products/en?keywords=3M%20961206-6404-AR) +1. 10pin to 6pin adapter: [Example ebay link](http://www.ebay.fr/itm/10-Pin-a-6-Pin-Carte-Adaptateur-M-F-pour-AVRISP-USBASP-STK500-Noir-Bleu-WT-/291862396761?hash=item43f45abf59:g:gXsAAOSwMgdXyGnh) +1. 6 pin header like this one: [Example Digi-Key link](http://www.digikey.com/products/en?keywords=3M%20961206-6404-AR) 1.The 6 Pin header needs to be solder on the board like indicated by the red rectangle: - - Banggood readymade 4-in-1 module: - - - DIY Mulitprotocol modules (like the 2.3d board): - - - Arduino Pro Mini module: - + * Banggood readymade 4-in-1 module: + * DIY Mulitprotocol modules (like the 2.3d board): + * Arduino Pro Mini module: ### Connect the programmer From c32e3901841554b7a4d09ce3a0a2669b4d1fccdb Mon Sep 17 00:00:00 2001 From: Sebastien Charpentier Date: Wed, 19 Apr 2017 10:07:28 +0200 Subject: [PATCH 043/121] Update Compiling.md --- docs/Compiling.md | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/docs/Compiling.md b/docs/Compiling.md index d4c2c45..8e52b40 100644 --- a/docs/Compiling.md +++ b/docs/Compiling.md @@ -15,14 +15,13 @@ The procedure below will guide you through all the steps to upload successfully ### Material you need to upload the firmware -1. USBASP programmer supporting 3.3V: [Example aliexpress link](https://www.aliexpress.com/item/USBasp-USB-ISP-3-3V-5V-AVR-Programmer-USB-ATMEGA8-ATMEGA128-New-10PIN-Wire-Support/2036402518.html?spm=2114.30010308.8.10.jIbHzs) -There are reports that some of the cheap programmers are not safe to use with 3.3V units, usually the black PCB versions are ok. -1. 10pin to 6pin adapter: [Example ebay link](http://www.ebay.fr/itm/10-Pin-a-6-Pin-Carte-Adaptateur-M-F-pour-AVRISP-USBASP-STK500-Noir-Bleu-WT-/291862396761?hash=item43f45abf59:g:gXsAAOSwMgdXyGnh) -1. 6 pin header like this one: [Example Digi-Key link](http://www.digikey.com/products/en?keywords=3M%20961206-6404-AR) -1.The 6 Pin header needs to be solder on the board like indicated by the red rectangle: - * Banggood readymade 4-in-1 module: - * DIY Mulitprotocol modules (like the 2.3d board): - * Arduino Pro Mini module: +1. USBASP programmer supporting 3.3V:

[(example aliexpress link)](https://www.aliexpress.com/item/USBasp-USB-ISP-3-3V-5V-AVR-Programmer-USB-ATMEGA8-ATMEGA128-New-10PIN-Wire-Support/2036402518.html?spm=2114.30010308.8.10.jIbHzs)
There are reports that some of the cheap programmers are not safe to use with 3.3V units, usually the black PCB versions are ok. +1. 10pin to 6pin adapter:

[(example ebay link)](http://www.ebay.fr/itm/10-Pin-a-6-Pin-Carte-Adaptateur-M-F-pour-AVRISP-USBASP-STK500-Noir-Bleu-WT-/291862396761?hash=item43f45abf59:g:gXsAAOSwMgdXyGnh) +1. 6 pin header like this one:

[(example Digi-Key link)](http://www.digikey.com/products/en?keywords=3M%20961206-6404-AR) +1. The 6 Pin header needs to be solder on the board like indicated by the red rectangle: + * Banggood readymade 4-in-1 module:
+ * DIY Mulitprotocol modules (like the 2.3d board):
+ * Arduino Pro Mini module:
### Connect the programmer From adeea85c9ac1b667e3e893cbcdc53da7d78623fe Mon Sep 17 00:00:00 2001 From: LapinFou Date: Wed, 19 Apr 2017 10:12:01 +0200 Subject: [PATCH 044/121] Cosmetic. --- docs/Compiling.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/Compiling.md b/docs/Compiling.md index 8e52b40..53e2993 100644 --- a/docs/Compiling.md +++ b/docs/Compiling.md @@ -15,13 +15,13 @@ The procedure below will guide you through all the steps to upload successfully ### Material you need to upload the firmware -1. USBASP programmer supporting 3.3V:

[(example aliexpress link)](https://www.aliexpress.com/item/USBasp-USB-ISP-3-3V-5V-AVR-Programmer-USB-ATMEGA8-ATMEGA128-New-10PIN-Wire-Support/2036402518.html?spm=2114.30010308.8.10.jIbHzs)
There are reports that some of the cheap programmers are not safe to use with 3.3V units, usually the black PCB versions are ok. -1. 10pin to 6pin adapter:

[(example ebay link)](http://www.ebay.fr/itm/10-Pin-a-6-Pin-Carte-Adaptateur-M-F-pour-AVRISP-USBASP-STK500-Noir-Bleu-WT-/291862396761?hash=item43f45abf59:g:gXsAAOSwMgdXyGnh) -1. 6 pin header like this one:

[(example Digi-Key link)](http://www.digikey.com/products/en?keywords=3M%20961206-6404-AR) +1. USBASP programmer supporting 3.3V:

[(example aliexpress link)](https://www.aliexpress.com/item/USBasp-USB-ISP-3-3V-5V-AVR-Programmer-USB-ATMEGA8-ATMEGA128-New-10PIN-Wire-Support/2036402518.html?spm=2114.30010308.8.10.jIbHzs)
There are reports that some of the cheap programmers are not safe to use with 3.3V units, usually the black PCB versions are ok.

+1. 10pin to 6pin adapter:

[(example ebay link)](http://www.ebay.fr/itm/10-Pin-a-6-Pin-Carte-Adaptateur-M-F-pour-AVRISP-USBASP-STK500-Noir-Bleu-WT-/291862396761?hash=item43f45abf59:g:gXsAAOSwMgdXyGnh)

+1. 6 pin header like this one:

[(example Digi-Key link)](http://www.digikey.com/products/en?keywords=3M%20961206-6404-AR)

1. The 6 Pin header needs to be solder on the board like indicated by the red rectangle: - * Banggood readymade 4-in-1 module:
- * DIY Mulitprotocol modules (like the 2.3d board):
- * Arduino Pro Mini module:
+ * Banggood readymade 4-in-1 module:


+ * DIY Mulitprotocol modules (like the 2.3d board):


+ * Arduino Pro Mini module:


### Connect the programmer From 799160510686b778606b092da8751daceff4c3fb Mon Sep 17 00:00:00 2001 From: Sebastien Charpentier Date: Wed, 19 Apr 2017 10:39:45 +0200 Subject: [PATCH 045/121] Update Compiling_STM32.md --- docs/Compiling_STM32.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/Compiling_STM32.md b/docs/Compiling_STM32.md index 958fb4e..195cb0b 100644 --- a/docs/Compiling_STM32.md +++ b/docs/Compiling_STM32.md @@ -8,8 +8,8 @@ On all modules with STM32F103 microcontroller, the program flash memory on the m 1. Compiling and flashing in Arduino IDE. 1. Flashing precompiled binaries from [here](https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/releases) - - If using one of these TX with multimodule like Turnigy 9X,9XR,9X+ the binary file for flashing is **Multiprotocol_V1.X.X_STM32.bin**. - - If using TARANIS TX the binary file is **Multiprotocol_V1.X.X_STM32_INV.bin** + - If using one of these TX with multimodule like Turnigy 9X,9XR,9X+ the binary file for flashing is **Multiprotocol_V1.X.X_STM32.bin**. + - If using TARANIS TX the binary file is **Multiprotocol_V1.X.X_STM32_INV.bin** Flashing precompiled **binaries** is done very simple with the cable setup presented below and an utility(GUI) **ST Flash Loader Demonstrator.** @@ -19,9 +19,9 @@ Flashing precompiled **binaries** is done very simple with the cable setup prese 1. Download the Arduino IDE. The currently supported Arduino version is 1.6.11 available for [Windows]( https://www.arduino.cc/download_handler.php?f=/arduino-1.6.12-windows.exe) and [Mac OSX](http://arduino.cc/download_handler.php?f=/arduino-1.6.12-macosx.zip) 1. It is recommended to upgrade Java to the [latest version](https://www.java.com/en/download/) 1. Download the [STM32 Core](https://github.com/rogerclarkmelbourne/Arduino_STM32/archive/master.zip) and copy the Arduino_STM32 folder to: - - OSX: ```Arduino.app/Contents/Java/hardware``` (you can open Arduino.app by Ctl Clicking on Arduino.app and selecting "Show Package Contents") - - Windows: ```C:\Program Files (x86)\Arduino\hardware``` - - Make sure the folder tree structure is like this .....\hardware\Arduino_STM32\.....and **NOT** ...... \hardware\Arduino_STM32-master\Arduino_STM32-master\......So move the folders /rename accordingly. + - OSX: ```Arduino.app/Contents/Java/hardware``` (you can open Arduino.app by Ctl Clicking on Arduino.app and selecting "Show Package Contents") + - Windows: ```C:\Program Files (x86)\Arduino\hardware``` + - Make sure the folder tree structure is like this .....\hardware\Arduino_STM32\.....and **NOT** ...... \hardware\Arduino_STM32-master\Arduino_STM32-master\......So move the folders /rename accordingly. 1. Download the zip file with the Multiprotocol module source code from [here](https://github.com/pascallanger/DIY-Multiprotocol-TX-Module) 1. Unzip and copy the source code folder ```Multiprotocol``` to a folder of your choosing 1. Click on the ```Multiprotocol.ino file``` in the ```Multiprotocol``` folder and the Arduino environment should appear and the Multiprotocol project will be loaded. @@ -61,9 +61,9 @@ The second method is definitely the easiest in the long-term, but it does requi 1. Put the module in the Tx 1. Place a jumper over the BOOT0 pins.Skip this one if you made your own cable for flashing ,see below. 1. Connect your 3.3V/5V FTDI cable (USB - TTL serial) to Multiprotocol serial port. Connect only RX, TX and GND. **Do not connect the 5V or 3.3V between the FTDI cable and the module - the power will be supplied by the transmitter**. Connect the pins as follows: - - Module RX pin to FTDI TX pin - - Module TX pin to FTDI Rx pin - - Module GND to FTDI GND + - Module RX pin to FTDI TX pin + - Module TX pin to FTDI Rx pin + - Module GND to FTDI GND 1. In arduino IDE under the **Tools** -> **Board:** check that you have selected the **Generic STM32F103C series** board 1. Under **Tools** -> **Upload Method:** select **Serial** 1. Click "Upload" and the sketch will be uploaded normally. This is valid for all arduino versions. @@ -111,7 +111,7 @@ Run the ST Flash Loader program. There are many tutorials on the web on how to u #### OSX: To be checked. -###Report issues for the STM32 board +### Report issues for the STM32 board You can report your problem using the [GitHub issue](https://github.com/midelic/DIY-Multiprotocol-TX-Module/issues) system or go to the [Main thread on RCGROUPS](http://www.rcgroups.com/forums/showthread.php?t=2165676) to ask your question. Please provide the following information: From c2050d4314559f342122b477f62e349596a04e6a Mon Sep 17 00:00:00 2001 From: Sebastien Charpentier Date: Wed, 19 Apr 2017 10:41:32 +0200 Subject: [PATCH 046/121] Update Compiling_STM32.md --- docs/Compiling_STM32.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/Compiling_STM32.md b/docs/Compiling_STM32.md index 195cb0b..f45ab8e 100644 --- a/docs/Compiling_STM32.md +++ b/docs/Compiling_STM32.md @@ -44,10 +44,10 @@ Flashing precompiled **binaries** is done very simple with the cable setup prese **}** ***/** -1. Run the IDE, and on the **Tools** menu, select **Board** and then **Boards manager**. Click on the Arduino DUE (32 Bits ARM-Cortex M3) from the list of available boards. You must do this step, it installs the arm-none-eabi-g++ toolchain! +1. Run the IDE, and on the **Tools** menu, select **Board** and then **Boards manager**.
Click on the Arduino DUE (32 Bits ARM-Cortex M3) from the list of available boards. You must do this step, it installs the arm-none-eabi-g++ toolchain! 1. Close and reopen the Arduino IDE and load the Multiprotocol project. 1. In arduino IDE under the **Tools** -> **Board:** select the **Generic STM32F103C series** board -1. Click on the **Verify** button to test compile the before you make any changes. If there are any errors check the process above and be sure to have the right version of the Arduino IDE.The binary file generated location is presented at the bottom of Arduino IDE compiling window.Now continue with flashing procedure. +1. Click on the **Verify** button to test compile the before you make any changes.
If there are any errors check the process above and be sure to have the right version of the Arduino IDE.The binary file generated location is presented at the bottom of Arduino IDE compiling window.Now continue with flashing procedure. ### Flashing the multimodule @@ -60,7 +60,7 @@ The second method is definitely the easiest in the long-term, but it does requi 1. Put the module in the Tx 1. Place a jumper over the BOOT0 pins.Skip this one if you made your own cable for flashing ,see below. -1. Connect your 3.3V/5V FTDI cable (USB - TTL serial) to Multiprotocol serial port. Connect only RX, TX and GND. **Do not connect the 5V or 3.3V between the FTDI cable and the module - the power will be supplied by the transmitter**. Connect the pins as follows: +1. Connect your 3.3V/5V FTDI cable (USB - TTL serial) to Multiprotocol serial port.
Connect only RX, TX and GND. **Do not connect the 5V or 3.3V between the FTDI cable and the module - the power will be supplied by the transmitter**. Connect the pins as follows: - Module RX pin to FTDI TX pin - Module TX pin to FTDI Rx pin - Module GND to FTDI GND From 2d44c8914962f2fc7ae916fff9b243fd5e6a69bc Mon Sep 17 00:00:00 2001 From: Sebastien Charpentier Date: Wed, 19 Apr 2017 10:43:59 +0200 Subject: [PATCH 047/121] Update Models.md Fixed **CH6 and CH7** section. --- docs/Models.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/Models.md b/docs/Models.md index f1209a0..a197f4d 100644 --- a/docs/Models.md +++ b/docs/Models.md @@ -165,10 +165,10 @@ CH6 and CH7 can be assigned to switches or pots to provide additionaly functiona Replicating the stock setup of two pots, you would assign: -Channel | Weight | Source | Multiplex ---- | --- | --- | --- | --- -CH6 | +100% | P1 | ADD -CH7 | +100% | P3 | ADD +Channel|Weight|Source|Multiplex +---|---|---|--- +CH6|+100%|P1|ADD +CH7|+100%|P3|ADD ## Full Mixer Setup From f4865c52064ddb976fae7417b4cefc9841aec4e9 Mon Sep 17 00:00:00 2001 From: Sebastien Charpentier Date: Wed, 19 Apr 2017 10:46:53 +0200 Subject: [PATCH 048/121] Update Hardware.md Highlighted the "more information when clicking on the pictures". --- docs/Hardware.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Hardware.md b/docs/Hardware.md index 4748bfb..af18d4f 100644 --- a/docs/Hardware.md +++ b/docs/Hardware.md @@ -2,7 +2,7 @@ The choice of **Multiprotocol Transmitter Module (MULTI-Module)** hardware is the single biggest choice you will make. Due to the growing popularity of this project the number of hardware choices is growing almost monthly. -There are currently four common hardware options. They are (**click on the pictures for more info**): +There are currently four common hardware options. They are (`click on the pictures for more info`): 1. A ready-made 4-in-1 MULTI-Module which integrates the microcontroller with all four supported RF modules and a hardware antenna switcher. [](Module_BG_4-in-1.md) From 9d2ac3f2c42563d2b3a97ea5bf7d39d404ef126c Mon Sep 17 00:00:00 2001 From: Sebastien Charpentier Date: Wed, 19 Apr 2017 11:13:33 +0200 Subject: [PATCH 049/121] Update README-old.md Fixed Markdown. --- docs/README-old.md | 74 +++++++++++++++++++++++----------------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/docs/README-old.md b/docs/README-old.md index 3d6b7ff..ceb1c4e 100644 --- a/docs/README-old.md +++ b/docs/README-old.md @@ -10,7 +10,7 @@ The source code is partly based on the Deviation TX project, thanks to all the d **To download the latest compiled version (hex file), click on [Release](https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/releases) on the top menu.** -##Contents +## Contents [Compatible TX](https://github.com/pascallanger/DIY-Multiprotocol-TX-Module#compatible-tx) @@ -22,9 +22,9 @@ The source code is partly based on the Deviation TX project, thanks to all the d [Troubleshooting](https://github.com/pascallanger/DIY-Multiprotocol-TX-Module#troubleshooting) -##Compatible TX +## Compatible TX -###Using standard PPM output (trainer port) +### Using standard PPM output (trainer port) The multiprotocol TX module can be used on any TX with a trainer port. Channels order is AETR by default but can be changed in the _Config.h. @@ -44,7 +44,7 @@ Settings per selection are located in _Config.h: - Option: -127..+127 allowing to set specific protocol options. Like for Hubsan to set the video frequency. - Autobind: Yes or No. At the model selection (or power applied to the TX) a bind sequence will be initiated -###Using a serial output +### Using a serial output The multiprotocol TX module takes full advantage of being used on a Turnigy 9X, 9XR, 9XR Pro, Taranis, 9Xtreme, AR9X, ... running [er9x](http://openrcforums.com/forum/viewtopic.php?f=5&t=4598) or [ersky9X](http://openrcforums.com/forum/viewtopic.php?f=7&t=4676). An OpenTX version for Taranis is available [here](http://plaisthos.de/opentx/). This enables full integration using the radio GUI to setup models with all the available protocols options. @@ -65,7 +65,7 @@ Notes: - There are 2 versions of serial protocol either 8 or 16 channels. 16 channels is the latest and only available version going forward. Make sure to use the right version based on your version of er9x/ersky9x. - Channels order is AETR by default but can be changed in _Config.h. -###Telemetry +### Telemetry There are 4 protocols supporting telemetry: Hubsan, DSM, FrSkyD and FrSkyX. @@ -94,9 +94,9 @@ Enabling telemetry on a 9XR PRO and may be other TXs does not require any hardwa Once the TX is telemetry enabled, it just needs to be configured on the model (see er9x/ersky9x documentation). -##Protocols +## Protocols -###TX ID +### TX ID The multiprotocol TX module is using a 32bits ID generated randomly at first power up. This global ID is used by nearly all protocols. There are little chances to get a duplicated ID. @@ -104,7 +104,7 @@ For DSM2/X and Devo the CYRF6936 unique manufacturer ID is used. It's possible to generate a new ID using bind button on the Hubsan protocol during power up. -###Bind +### Bind To bind a model in PPM Mode press the physical bind button, apply power and then release. In Serial Mode you have 2 options: @@ -115,9 +115,9 @@ Notes: - the physical bind button is only effective at power up. Pressing the button later has no effects. - a bind in progress is indicated by the LED fast blinking. Make sure to bind during this period. -###Protocol selection +### Protocol selection -####Using the dial for PPM input +#### Using the dial for PPM input PPM is only allowing access to a subset of existing protocols. The protocols, subprotocols and all other settings can be personalized by modifying the **_Config.h** file. @@ -145,10 +145,10 @@ Dial|Protocol|Sub_protocol|RX Num|Power|Auto Bind|Option|RF Module Note: - The dial selection must be done before the power is applied. -####Using serial input with er9x/ersky9x +#### Using serial input with er9x/ersky9x Serial is allowing access to all existing protocols & sub_protocols listed below. -#####A7105 RF module +##### A7105 RF module Protocol|Sub_protocol --------|------------ Flysky| @@ -158,7 +158,7 @@ Flysky| |V912 Hubsan| -#####CC2500 RF module +##### CC2500 RF module Protocol|Sub_protocol --------|------------ FrSkyV| @@ -168,7 +168,7 @@ FrSkyX| |CH_8 SFHSS| -#####CYRF6936 RF module +##### CYRF6936 RF module Protocol|Sub_protocol --------|------------ DSM| @@ -177,7 +177,7 @@ DSM| Devo| J6Pro| -#####NRF24L01 RF module +##### NRF24L01 RF module Protocol|Sub_protocol --------|------------ Hisky| @@ -235,12 +235,12 @@ HONTAI| Note: - The dial should be set to 0 for serial. Which means all protocol selection pins should be left unconnected. -###Protocols details +### Protocols details **Check the [Protocols_Details.md](./Protocols_Details.md) file for a detailed description of every protocols with channels assignements.** -##Hardware +## Hardware -###RF modules +### RF modules Up to 4 RF modules can be installed: - [A7105](http://www.banggood.com/XL7105-D03-A7105-Modification-Module-Support-Deviation-Galee-Flysky-p-922603.html) for Flysky, Hubsan - [CC2500](http://www.banggood.com/CC2500-PA-LNA-Romote-Wireless-Module-CC2500-SI4432-NRF24L01-p-922595.html) for FrSkyV, FrSkyD, FrSkyX and SFHSS @@ -251,21 +251,21 @@ RF modules can be installed for protocols need only. Example: if you only need t You also need some [antennas](http://www.banggood.com/2_4GHz-3dBi-RP-SMA-Connector-Booster-Wireless-Antenna-Modem-Router-p-979407.html) and [cables](http://www.banggood.com/10cm-PCI-UFL-IPX-to-RPSMA-Female-Jack-Pigtail-Cable-p-924933.html). -###Board +### Board The main program is running on an ATMEGA328p running @16MHz and 3.3V. An [Arduino pro mini 16Mhz/5V](http://www.banggood.com/Wholesale-New-Ver-Pro-Mini-ATMEGA328-328p-5V-16MHz-Arduino-Compatible-Nano-Size-p-68534.html) powered at 3.3V (yes it works) can be used to build your own Multimodule. An Arduino Mini based on Atmega328p can also be used. -####Using stripboard: +#### Using stripboard: ![Screenshot](http://static.rcgroups.net/forums/attachments/4/0/8/5/8/3/t8214655-87-thumb-uploadfromtaptalk1405598143749.jpg?d=1441459923) ![Screenshot](http://static.rcgroups.net/forums/attachments/4/0/8/5/8/3/t8214656-102-thumb-uploadfromtaptalk1405598152484.jpg?d=1441459924) -####Using a [home made PCB](http://www.rcgroups.com/forums/showpost.php?p=32645328&postcount=1621): +#### Using a [home made PCB](http://www.rcgroups.com/forums/showpost.php?p=32645328&postcount=1621): ![Screenshot](http://static.rcgroups.net/forums/attachments/1/1/5/4/3/7/t8226720-197-thumb-IMG_20150715_230603155.jpg?d=1441816457) ![Screenshot](http://static.rcgroups.net/forums/attachments/1/1/5/4/3/7/t8226719-72-thumb-IMG_20150715_230024065.jpg?d=1441816456) -####Build your own board using [SMD components](http://www.rcgroups.com/forums/showpost.php?p=31064232&postcount=1020) and an [associated PCB v2.3c](https://oshpark.com/shared_projects/MaGYDg0y): +#### Build your own board using [SMD components](http://www.rcgroups.com/forums/showpost.php?p=31064232&postcount=1020) and an [associated PCB v2.3c](https://oshpark.com/shared_projects/MaGYDg0y): ![Screenshot](http://static.rcgroups.net/forums/attachments/4/0/8/5/8/3/t7566755-3-thumb-i.png?d=1423810885) ![Screenshot](http://static.rcgroups.net/forums/attachments/4/0/8/5/8/3/t7952726-108-thumb-image-62c29cf2.jpg?d=1433909893) @@ -284,7 +284,7 @@ lines through them. [OSH Park link](https://oshpark.com/shared_projects/Ztus1ah8) if you want to order. -####Buy a ready to use and complete Multi module +#### Buy a ready to use and complete Multi module ![Screenshot](http://img.banggood.com/thumb/view/oaupload/banggood/images/1D/EB/19bb6434-4616-411e-b8fa-a4c21d9dca24.jpg) This module can be purchased [here](http://www.banggood.com/2_4G-CC2500-A7105-Flysky-Frsky-Devo-DSM2-Multiprotocol-TX-Module-With-Antenna-p-1048377.html). All the 4 RF modules are already implemented A7105, NRF24L01, CC2500 and CYRF6936. The board is also equiped with an antenna switcher which means only one antenna for all. @@ -299,14 +299,14 @@ If you want to enable serial mode for er9x/ersky9x/Taranis/... and depending on Note: if you have the 1st board revision (check pictures above), sometime bind occures at power up even without pressing the bind button or not having an autobind protocol. To solve this issue, replacing the BIND led resistor (on the board back) of 1.2K by a 4.7K. -###Schematic +### Schematic ![Screenshot](http://static.rcgroups.net/forums/attachments/4/0/8/5/8/3/a8443844-119-multiprotocol_diagram_rotary_serial_2.jpg) Notes: - Attention: All modules are 3.3V only, never power them with 5V. - For serial, the dial switch is not needed and the bind button optionnal -###Radio integration +### Radio integration If you build your own version of the board you can 3D print this case (details [here](http://www.rcgroups.com/forums/showpost.php?p=33294140&postcount=2034)): ![Screenshot](http://static.rcgroups.net/forums/attachments/1/1/5/4/3/7/t8462144-54-thumb-Multi_case_9XR.jpg?d=1448575289) @@ -318,9 +318,9 @@ If you have the Banggood ready to use board you can 3D print this case (details -##Compilation and programmation +## Compilation and programmation -###Toolchain +### Toolchain Multiprotocol source can be compiled using the Arduino IDE. The currently supported Arduino version is [1.6.10](https://www.arduino.cc/download_handler.php?f=/arduino-1.6.10-windows.exe). @@ -335,7 +335,7 @@ Notes: - Compilation of the code posted here works. So if it doesn't for you this is a problem with your setup, please double check everything before asking. - If you want to reduce the code size even further, you can modify the file platform.txt located in "C:\Program Files (x86)\Arduino\hardware\arduino\avr". Set the line "compiler.c.elf.extra_flags=" to "compiler.c.elf.extra_flags=-Wl,--relax". -###Upload the code using ISP (In System Programming) +### Upload the code using ISP (In System Programming) It is recommended to use an external programmer like [USBASP](http://www.banggood.com/USBASP-USBISP-3_3-5V-AVR-Downloader-Programmer-With-ATMEGA8-ATMEGA128-p-934425.html) to upload the code in the Atmega328. The programmer should be set to 3.3V or nothing to not supply any over voltage to the multimodule and avoid any damages. The dial must be set to 0 before flashing! @@ -344,7 +344,7 @@ From the Arduino environment, you can use this shortcut to compile and upload to To flash the latest provided hex file under [Release](https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/releases), you can use a tool like [AVR Burn-O-Mat](http://avr8-burn-o-mat.aaabbb.de/), set the microcontroller to m328p and flash it. -###Upload the code using FTDI (USB serial to TTL) +### Upload the code using FTDI (USB serial to TTL) Use this method only for Arduino Pro Mini boards with bootloader. Use an external FTDI adapter like [this one](http://www.banggood.com/FT232RL-FTDI-USB-To-TTL-Serial-Converter-Adapter-Module-For-Arduino-p-917226.html). @@ -355,7 +355,7 @@ From the Arduino environment, you can use Upload button which will compile and u To upload the latest provided hex file under [Release](https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/releases), you can use a tool like [XLoader](http://russemotto.com/xloader/), set the microcontroller to Atmega328 and upload it. -###Set fuses +### Set fuses Use a tool like [AVR Burn-O-Mat](http://avr8-burn-o-mat.aaabbb.de/) to set the fuses of the Atmega328 to: - Extended Fuse 0x05 (or 0xFD which is the same) - High Fuse 0xD2 @@ -363,25 +363,25 @@ Use a tool like [AVR Burn-O-Mat](http://avr8-burn-o-mat.aaabbb.de/) to set the f This will make sure your ATMEGA328 is well configured and the global TX ID is not erased at each updates. -##Troubleshooting +## Troubleshooting -###LED status +### LED status - off: program not running or a protocol selected with the associated module not installed. - flash(on=0.1s,off=1s): invalid protocol selected (excluded from compilation or invalid protocol number) - slow blink(on=0.5s,off=0.5s): serial has been selected but no valid signal has been seen on the RX pin. - fast blink(on=0.1s,off=0.1s): bind in progress. - on: normal operation. -###Protocol selection -####Input Mode - PPM +### Protocol selection +#### Input Mode - PPM - The protocol/mode selection must be done before the power is applied. - Connect 1 to 4 of the selection protocol pins to GND. -####Input Mode - Serial +#### Input Mode - Serial - Make sure you have done the mods to the v2.3c PCB by adding the 2.2k and 470 ohm resistors as indicated in the [Board section] (https://github.com/pascallanger/DIY-Multiprotocol-TX-Module#board). - Leave all 4 selection pins unconnected. -###Bind +### Bind Make sure to follow this procedure: press the bind button, apply power and then release it after 1sec. The LED should be blinking fast indicating a bind status and then fixed on when the bind period is over. It's normal that the LED turns off when you press the bind button, this behavior is not controlled by the Atmega328. For serial, the preffered method is to bind via the GUI protocol page. @@ -389,7 +389,7 @@ If your module is always/sometime binding at power up without pressing the butto - Arduino Pro Mini with an external status LED: to work around this issue connect a 10K resistor between D13 and 3.3V. - 4in1 module V1 (check 4in1 pictures): to solve this issue, replacing the BIND led resistor (on the board back) of 1.2K by a 4.7K. -###Report issues +### Report issues You can report your problem using the [GitHub issue](https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/issues) system or go to the [Main thread on RCGROUPS](http://www.rcgroups.com/forums/showthread.php?t=2165676) to ask your question. Please provide the following information: - Multiprotocol code version From cc9a5893def2d9d093200573834b9c3b0e5a8013 Mon Sep 17 00:00:00 2001 From: Sebastien Charpentier Date: Wed, 19 Apr 2017 11:15:17 +0200 Subject: [PATCH 050/121] Update BOM_DIY_ATmega.md --- docs/BOM_DIY_ATmega.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/BOM_DIY_ATmega.md b/docs/BOM_DIY_ATmega.md index 7f5751f..d686b40 100644 --- a/docs/BOM_DIY_ATmega.md +++ b/docs/BOM_DIY_ATmega.md @@ -1,4 +1,4 @@ -#Bill of Materials DIY ATmega Module +# Bill of Materials DIY ATmega Module Here is the bill of materials for the ATmega328 version of the DIY MPTM. From 12dd851fc36aade78b8e3ae6007d4ae90f6fa51d Mon Sep 17 00:00:00 2001 From: Sebastien Charpentier Date: Wed, 19 Apr 2017 11:16:07 +0200 Subject: [PATCH 051/121] Update BOM_DIY_ATmega.md --- docs/BOM_DIY_ATmega.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/BOM_DIY_ATmega.md b/docs/BOM_DIY_ATmega.md index d686b40..b6506a4 100644 --- a/docs/BOM_DIY_ATmega.md +++ b/docs/BOM_DIY_ATmega.md @@ -2,7 +2,7 @@ Here is the bill of materials for the ATmega328 version of the DIY MPTM. -If you are looking for the BOM for the DIY STM32 version click [here](BOM_DIY_STM32.md). +If you are looking for the BOM for the DIY STM32 version click [here](BOM_DIY_STM32 & Schematic.md). Digikey may not be your preferred supplier, but you should find enough information on their page to cross reference parts. From 36f194b9bd5c6328110a8563d842b77f240863dd Mon Sep 17 00:00:00 2001 From: Sebastien Charpentier Date: Wed, 19 Apr 2017 11:29:54 +0200 Subject: [PATCH 052/121] Update BOM_DIY_ATmega.md Fixed **BOM for the DIY STM32** link. --- docs/BOM_DIY_ATmega.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/BOM_DIY_ATmega.md b/docs/BOM_DIY_ATmega.md index b6506a4..b129e1e 100644 --- a/docs/BOM_DIY_ATmega.md +++ b/docs/BOM_DIY_ATmega.md @@ -2,7 +2,7 @@ Here is the bill of materials for the ATmega328 version of the DIY MPTM. -If you are looking for the BOM for the DIY STM32 version click [here](BOM_DIY_STM32 & Schematic.md). +If you are looking for the BOM for the DIY STM32 version click [here](BOM_DIY_STM32%20&%20Schematic.md). Digikey may not be your preferred supplier, but you should find enough information on their page to cross reference parts. From dfa120339c3123a0ab6ff8a25dd03c36b1336a00 Mon Sep 17 00:00:00 2001 From: Sebastien Charpentier Date: Wed, 19 Apr 2017 11:30:21 +0200 Subject: [PATCH 053/121] Update BOM_DIY_STM32 & Schematic.md --- docs/BOM_DIY_STM32 & Schematic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/BOM_DIY_STM32 & Schematic.md b/docs/BOM_DIY_STM32 & Schematic.md index 8a280d1..123ed49 100644 --- a/docs/BOM_DIY_STM32 & Schematic.md +++ b/docs/BOM_DIY_STM32 & Schematic.md @@ -1,4 +1,4 @@ -#Bill of Materials DIY STM32 Module +# Bill of Materials DIY STM32 Module Here is the bill of materials for the STM32 version of the DIY MPTM. There are three versions. Carefully compare your board with the pictures below to determine which version you have. From a0a0cd4f57bea999b9ba9e7b675550c2713119c8 Mon Sep 17 00:00:00 2001 From: Sebastien Charpentier Date: Wed, 19 Apr 2017 11:32:19 +0200 Subject: [PATCH 054/121] Update Compiling.md --- docs/Compiling.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/docs/Compiling.md b/docs/Compiling.md index 53e2993..c562b8a 100644 --- a/docs/Compiling.md +++ b/docs/Compiling.md @@ -108,10 +108,7 @@ First, we need to append some text to the Arduino file boards.txt. #### On Windows 1. Close the Arduino IDE -1. Search Windows for the application WordPad (DO NOT USE Notepad). Right click on WordPad and select "Run as Administrator": - - - +1. Search Windows for the application WordPad (DO NOT USE Notepad). Right click on WordPad and select "Run as Administrator":


1. Open the file ```boards.txt``` located in this folder ```C:\Program Files(x86)\Arduino\hardware\arduino\avr ``` or the equivalent if you have installed Aduino in a different directory. 1. Append the following text into the end of the file and save it: From 70f7c6a25e6f1ff9521e062331e5921c69d356e1 Mon Sep 17 00:00:00 2001 From: Sebastien Charpentier Date: Wed, 19 Apr 2017 11:33:14 +0200 Subject: [PATCH 055/121] Update Compiling.md --- docs/Compiling.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Compiling.md b/docs/Compiling.md index c562b8a..ae17177 100644 --- a/docs/Compiling.md +++ b/docs/Compiling.md @@ -108,7 +108,7 @@ First, we need to append some text to the Arduino file boards.txt. #### On Windows 1. Close the Arduino IDE -1. Search Windows for the application WordPad (DO NOT USE Notepad). Right click on WordPad and select "Run as Administrator":


+1. Search Windows for the application WordPad (DO NOT USE Notepad).
Right click on WordPad and select "Run as Administrator":

1. Open the file ```boards.txt``` located in this folder ```C:\Program Files(x86)\Arduino\hardware\arduino\avr ``` or the equivalent if you have installed Aduino in a different directory. 1. Append the following text into the end of the file and save it: From 948f28b0afc3f37164f73d130ba681055518f853 Mon Sep 17 00:00:00 2001 From: Sebastien Charpentier Date: Wed, 19 Apr 2017 11:34:20 +0200 Subject: [PATCH 056/121] Update Compiling.md Fixed **On Windows** section. --- docs/Compiling.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/Compiling.md b/docs/Compiling.md index ae17177..5f3b080 100644 --- a/docs/Compiling.md +++ b/docs/Compiling.md @@ -15,13 +15,13 @@ The procedure below will guide you through all the steps to upload successfully ### Material you need to upload the firmware -1. USBASP programmer supporting 3.3V:

[(example aliexpress link)](https://www.aliexpress.com/item/USBasp-USB-ISP-3-3V-5V-AVR-Programmer-USB-ATMEGA8-ATMEGA128-New-10PIN-Wire-Support/2036402518.html?spm=2114.30010308.8.10.jIbHzs)
There are reports that some of the cheap programmers are not safe to use with 3.3V units, usually the black PCB versions are ok.

-1. 10pin to 6pin adapter:

[(example ebay link)](http://www.ebay.fr/itm/10-Pin-a-6-Pin-Carte-Adaptateur-M-F-pour-AVRISP-USBASP-STK500-Noir-Bleu-WT-/291862396761?hash=item43f45abf59:g:gXsAAOSwMgdXyGnh)

-1. 6 pin header like this one:

[(example Digi-Key link)](http://www.digikey.com/products/en?keywords=3M%20961206-6404-AR)

+1. USBASP programmer supporting 3.3V:

[(example aliexpress link)](https://www.aliexpress.com/item/USBasp-USB-ISP-3-3V-5V-AVR-Programmer-USB-ATMEGA8-ATMEGA128-New-10PIN-Wire-Support/2036402518.html?spm=2114.30010308.8.10.jIbHzs)
There are reports that some of the cheap programmers are not safe to use with 3.3V units, usually the black PCB versions are ok.
+1. 10pin to 6pin adapter:

[(example ebay link)](http://www.ebay.fr/itm/10-Pin-a-6-Pin-Carte-Adaptateur-M-F-pour-AVRISP-USBASP-STK500-Noir-Bleu-WT-/291862396761?hash=item43f45abf59:g:gXsAAOSwMgdXyGnh)
+1. 6 pin header like this one:

[(example Digi-Key link)](http://www.digikey.com/products/en?keywords=3M%20961206-6404-AR)
1. The 6 Pin header needs to be solder on the board like indicated by the red rectangle: - * Banggood readymade 4-in-1 module:


- * DIY Mulitprotocol modules (like the 2.3d board):


- * Arduino Pro Mini module:


+ * Banggood readymade 4-in-1 module:

+ * DIY Mulitprotocol modules (like the 2.3d board):

+ * Arduino Pro Mini module:

### Connect the programmer From e537d27e2865ac086f7b22af4a7ebb69bcdcfe5f Mon Sep 17 00:00:00 2001 From: Sebastien Charpentier Date: Wed, 19 Apr 2017 11:40:28 +0200 Subject: [PATCH 057/121] Update Compiling_STM32.md Fixed **Prepare the Arduino IDE:** section. --- docs/Compiling_STM32.md | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/docs/Compiling_STM32.md b/docs/Compiling_STM32.md index f45ab8e..65e5db8 100644 --- a/docs/Compiling_STM32.md +++ b/docs/Compiling_STM32.md @@ -28,22 +28,16 @@ Flashing precompiled **binaries** is done very simple with the cable setup prese ### Prepare the Arduino IDE: -1. In order to compile successfully you need also to modify a maple library file. In ```....\hardware\Arduino_STM32\STM32F1\cores\maple\libmaple\usart_f1.c``` comment out the 2 functions as shown below. This is required to have low-level access to the USART interrupt. - -**/*** -**void __irq_usart2(void){** - -**usart_irq(&usart2_rb, USART2_BASE);** - -**}** - - **void __irq_usart3(void) {** - - **usart_irq(&usart3_rb, USART3_BASE);** - -**}** -***/** - +1. In order to compile successfully you need also to modify a maple library file. In ```....\hardware\Arduino_STM32\STM32F1\cores\maple\libmaple\usart_f1.c``` comment out the 2 functions as shown below. This is required to have low-level access to the USART interrupt.
+ ```C + /* void __irq_usart2(void){ + usart_irq(&usart2_rb, USART2_BASE); + } + + void __irq_usart3(void) { + usart_irq(&usart3_rb, USART3_BASE); + } */ + ``` 1. Run the IDE, and on the **Tools** menu, select **Board** and then **Boards manager**.
Click on the Arduino DUE (32 Bits ARM-Cortex M3) from the list of available boards. You must do this step, it installs the arm-none-eabi-g++ toolchain! 1. Close and reopen the Arduino IDE and load the Multiprotocol project. 1. In arduino IDE under the **Tools** -> **Board:** select the **Generic STM32F103C series** board From 706d43ee418648754984718bf06bb4449755aab6 Mon Sep 17 00:00:00 2001 From: Sebastien Charpentier Date: Wed, 19 Apr 2017 11:45:00 +0200 Subject: [PATCH 058/121] Update Advanced_Manually_Setting_ATmega328_Fuses.md --- docs/Advanced_Manually_Setting_ATmega328_Fuses.md | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/docs/Advanced_Manually_Setting_ATmega328_Fuses.md b/docs/Advanced_Manually_Setting_ATmega328_Fuses.md index d2c8c1b..22906de 100644 --- a/docs/Advanced_Manually_Setting_ATmega328_Fuses.md +++ b/docs/Advanced_Manually_Setting_ATmega328_Fuses.md @@ -10,10 +10,8 @@ There are many different options to upload a .hex firmware file to the MULTI-Mod 1. Make sure to write down the location of your installation since you need to know where avrdude is installed to configure the AVR8 Burn-O-Mat. For example on a default windows installation, avrdude.exe is located in "C:\Program Files (x86)\Arduino\hardware\tools\avr\bin" where "C:\Program Files (x86)\Arduino" is the installation path. 1. Install [AVR8 Burn-O-Mat](http://avr8-burn-o-mat.brischalle.de/avr8_burn_o_mat_avrdude_gui_en.php) which is available for all platforms. Installation instructions are on the software page (Don't forget to install [Java](http://java.sun.com/javase/downloads) as explained). 1. Launch AVR8 Burn-O-Mat. -1. You should now have a window which looks like this: - -1. Click on **Settings->AVRDUDE** and fill in the details about avrdude location using the installation path written previously as well as selecting USBASP for the programmer: - +1. You should now have a window which looks like this:
+1. Click on **Settings->AVRDUDE** and fill in the details about avrdude location using the installation path written previously as well as selecting USBASP for the programmer:
1. Once done click on OK. 1. You are now done with all the installations/configuration and ready to program your Multi-module. @@ -39,8 +37,7 @@ If you don't know which one to take the 1st line is the one you want. 1. In the **ATmega328P Fuses** window which just open click on read fuses. 1. Ignore the error "warning : Can not Set sck period . usbasp please check for firmware update .". 1. If you get an error there is something wrong with your connections, your programmer, or your board. Verify everything and go back to the 1st bullet point. -1. Set the 3 Fuse values - +1. Set the 3 Fuse values
1. Click on **apply** 1. Click on **write fuses** 1. Ignore the error "warning : Can not Set sck period . usbasp please check for firmware update .". From 517d2bb1ec2b4e996a20b6c50cbf6648a6c72f05 Mon Sep 17 00:00:00 2001 From: Sebastien Charpentier Date: Wed, 19 Apr 2017 11:45:57 +0200 Subject: [PATCH 059/121] Update Advanced_ATmega_Serial_Uploader.md --- docs/Advanced_ATmega_Serial_Uploader.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/Advanced_ATmega_Serial_Uploader.md b/docs/Advanced_ATmega_Serial_Uploader.md index 4c17e5b..5a58c4e 100644 --- a/docs/Advanced_ATmega_Serial_Uploader.md +++ b/docs/Advanced_ATmega_Serial_Uploader.md @@ -1,4 +1,4 @@ -#ATmega Serial Uploader +# ATmega Serial Uploader Mike Blandford adapted the optiboot bootloader for the 4-in-1 module to allow flashing of the module using a standard Arduino USB to serial adapter or FTDI adapter. No need to open the module case. Once set up is very easy to use: @@ -22,7 +22,7 @@ While the bootloader is running, if it detects a communication problem, it confi This bootloader is for reading and writing the flash only, the EEPROM is not supported, neither is reading/writing the fuses, but it only uses 512 bytes of flash. -##Install the bootloader +## Install the bootloader To get the bootloader onto the ATmega you need to connect an flashing tool (like USBasp) to the 6-pin ISP connector on the board. Simply flash the .hex file to get the bootloader on the chip, and change the high fuse at the same time. From ebaf56d96459eda728890b0d96709258ad4e8164 Mon Sep 17 00:00:00 2001 From: Sebastien Charpentier Date: Wed, 19 Apr 2017 11:59:16 +0200 Subject: [PATCH 060/121] Update Advanced_Manually_Setting_ATmega328_Fuses.md Changed hard-coded links to relative links. --- docs/Advanced_Manually_Setting_ATmega328_Fuses.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/Advanced_Manually_Setting_ATmega328_Fuses.md b/docs/Advanced_Manually_Setting_ATmega328_Fuses.md index 22906de..75c24f4 100644 --- a/docs/Advanced_Manually_Setting_ATmega328_Fuses.md +++ b/docs/Advanced_Manually_Setting_ATmega328_Fuses.md @@ -5,8 +5,8 @@ There are many different options to upload a .hex firmware file to the MULTI-Module and to set the correct fuses. This document outlines an approach that uses a USBASP programmer and which is equally compatible with OSX, Windows and Linux operating systems. -1. Follow this section: [Material you need to upload the firmware](https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/blob/master/docs/Compiling.md#material-you-need-to-upload-the-firmware) -1. Follow this section: [Install the Arduino IDE](https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/blob/master/docs/Compiling.md#install-the-arduino-ide-and-the-multiprotocol-project-firmware) +1. Follow this section: [Material you need to upload the firmware](Compiling.md#material-you-need-to-upload-the-firmware) +1. Follow this section: [Install the Arduino IDE](Compiling.md#install-the-arduino-ide-and-the-multiprotocol-project-firmware) 1. Make sure to write down the location of your installation since you need to know where avrdude is installed to configure the AVR8 Burn-O-Mat. For example on a default windows installation, avrdude.exe is located in "C:\Program Files (x86)\Arduino\hardware\tools\avr\bin" where "C:\Program Files (x86)\Arduino" is the installation path. 1. Install [AVR8 Burn-O-Mat](http://avr8-burn-o-mat.brischalle.de/avr8_burn_o_mat_avrdude_gui_en.php) which is available for all platforms. Installation instructions are on the software page (Don't forget to install [Java](http://java.sun.com/javase/downloads) as explained). 1. Launch AVR8 Burn-O-Mat. @@ -31,7 +31,7 @@ Banggood 4-in-1 module with [custom mikeb bootloader](Advanced_ATmega_Serial_Upl If you don't know which one to take the 1st line is the one you want. ### Burn the fuses -1. Follow this section: [Connect the programmer](https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/blob/master/docs/Compiling.md#connect-the-programmer) +1. Follow this section: [Connect the programmer](Compiling.md#connect-the-programmer) 1. Launch AVR8 Burn-O-Mat. 1. In the **AVR type** drop down select **ATmega328P** and click on **Fuses** 1. In the **ATmega328P Fuses** window which just open click on read fuses. @@ -45,7 +45,7 @@ If you don't know which one to take the 1st line is the one you want. 1. You are done with setting the Fuses and can close the **ATmega328P Fuses** window ## Upload the firmware -1. Follow this section: [Connect the programmer](https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/blob/master/docs/Compiling.md#connect-the-programmer) +1. Follow this section: [Connect the programmer](Compiling.md#connect-the-programmer) 1. Download the [latest release firmware](https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/releases) you want to burn and store it in a knwon location 1. Launch AVR8 Burn-O-Mat. 1. In the **AVR type** drop down select **ATmega328P** From 8ea06e84a6e2ca9144747cd27f854f76c7ac9977 Mon Sep 17 00:00:00 2001 From: Sebastien Charpentier Date: Wed, 19 Apr 2017 12:06:26 +0200 Subject: [PATCH 061/121] Update Module_Build_yourself_PCB.md --- docs/Module_Build_yourself_PCB.md | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/docs/Module_Build_yourself_PCB.md b/docs/Module_Build_yourself_PCB.md index ed2bd08..f59ba7b 100644 --- a/docs/Module_Build_yourself_PCB.md +++ b/docs/Module_Build_yourself_PCB.md @@ -33,12 +33,7 @@ The schematic for the board is [here](#V23D_Schematic). Please note that is is 1. The schematic and BOM for this board V1.0t and older boards are available [here](BOM_DIY_STM32 & Schematic.md). ### Common parts -1. A module case that fits your module like the one [here](https://www.xtremepowersystems.net/proddetail.php?prod=XPS-J1CASE) - - or you can 3D print your own from a selection on Thingiverse ([Example 1](http://www.thingiverse.com/thing:1852868) [Example 2](http://www.thingiverse.com/thing:1661833)). - [ ](http://www.thingiverse.com/thing:1852868) - For 9XR/9XR Pro, a new 3D printed module is available which makes use of the built in antenna in the handle. This means nothing is getting out of the radio back! You can find all details of this module case on [Thingiverse](http://www.thingiverse.com/thing:2050717). - +1. A module case that fits your module like the one [here](https://www.xtremepowersystems.net/proddetail.php?prod=XPS-J1CASE)

or you can 3D print your own from a selection on Thingiverse ([Example 1](http://www.thingiverse.com/thing:1852868) [Example 2](http://www.thingiverse.com/thing:1661833)).
[ ](http://www.thingiverse.com/thing:1852868)
For 9XR/9XR Pro, a new 3D printed module is available which makes use of the built in antenna in the handle. This means nothing is getting out of the radio back! You can find all details of this module case on [Thingiverse](http://www.thingiverse.com/thing:2050717).
1. A 2.4GHz antenna and pigtail ## Build instructions @@ -59,14 +54,12 @@ If you have a transmitter that can support serial communication with the board t #### **ATmega V2.3d board** There are four solder type jumpers on the bottom side of the board near the lower left corner when the bottom of the board is facing towards you. The silkscreen shows which jumper is which. These four jumpers enable the board to be configured in several ways as explaned below. - - (J-1) Use (PPM V/V) if the incoming PPM signal is at a higher voltage level, leave open if ~~5V. - +``` + (J-1) Use (PPM V/V) if the incoming PPM signal is at a higher voltage level, leave open if ~~5V. (J-2) Use (Jumper 2) to connect the incomming PPM signal to the RX pin on the processor - (J-3) Short (TELEM) only if you have done a telemetry mod to your radio, leave open if not needed. When connected, pin 2 of the two pin header (P3) is also connected. - - (J-4) Use (MOD) only to connect the transmitter pin 2 to pin 1 of the two pin header (P3). + (J-4) Use (MOD) only to connect the transmitter pin 2 to pin 1 of the two pin header (P3). +``` **It is most likely J-2 will be the only one needing to be shorted for the serial method of sending model protocols. If you plan to use telemetry you will also need to solder J-3** @@ -82,7 +75,7 @@ Here is the schematic you can use to troubleshoot the module General module schematic (reference) V2.3d Board Schematic - + ## PCB STM32 V1.0t Schematic - + From 09b454ba6ae7ac19f36439a0a4d0029289848cb0 Mon Sep 17 00:00:00 2001 From: Sebastien Charpentier Date: Wed, 19 Apr 2017 12:07:53 +0200 Subject: [PATCH 062/121] Update Module_Build_yourself_PCB.md Relative path is better. --- docs/Module_Build_yourself_PCB.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/Module_Build_yourself_PCB.md b/docs/Module_Build_yourself_PCB.md index f59ba7b..8c63f0c 100644 --- a/docs/Module_Build_yourself_PCB.md +++ b/docs/Module_Build_yourself_PCB.md @@ -75,7 +75,7 @@ Here is the schematic you can use to troubleshoot the module General module schematic (reference) V2.3d Board Schematic - + ## PCB STM32 V1.0t Schematic - + From 60d4f2d6c7ba1cfd7abdce89c74e865b27364a59 Mon Sep 17 00:00:00 2001 From: Sebastien Charpentier Date: Wed, 19 Apr 2017 14:44:38 +0200 Subject: [PATCH 063/121] Update PPM_Setup.md Fixed Markdown. Fixed link. --- docs/PPM_Setup.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/PPM_Setup.md b/docs/PPM_Setup.md index 96edc23..35bd18a 100644 --- a/docs/PPM_Setup.md +++ b/docs/PPM_Setup.md @@ -1,9 +1,9 @@ -#PPM Setup +# PPM Setup The Multiprotocol Module is compatible with any transmitter that is able to generate a PPM (Pulse Postion Modulation) output. This includes all transmitters with a module bay or a trainer port. It supports up to 16 channels from a PPM frame in the normal or inverted format (sometimes called positive or negative format in some transmitters). If you want the best performance you can set the number of channels and framerate corresponding to the number of channels of the specific receiver/model. -##PPM Connections +## PPM Connections If you do not have a module bay, there are only three wires you need to connect to get PPM to work. (The pins are numbered from top to bottom) - PPM on pin 1 - vbat on pin 3 @@ -12,7 +12,7 @@ If you do not have a module bay, there are only three wires you need to connect Note: vbat should be between 6V and 13V when using the 4-in-1 and 2.3 PCB boards. If you built a module from scratch it depends on the voltage regulator you chose. -##Enabling PPM mode in your transmitter +## Enabling PPM mode in your transmitter 1. Enable the default Tx mode to be AETR. If you do not want to change the default channel order on your Tx you must remember to change the channel order for each new model using the module to AETR under the Model Mixer menu. (**This is really important - this is for all protocols - even for DSM as the MULTI-module firware will change the transmitted channel order according to the protocol.**) 1. The default PPM settings is 8 channels with a frame period of 22.5 ms (sometimes called the frame rate). If you want to optimize performance you should change the channels to the actual number of channels required by your model. The corresponding frame period should be set to (number of channels + 1) * 2.5 ms. For example: @@ -29,7 +29,7 @@ The default mapping of protocols to switch positions can be viewed on the Protoc The mapping of protocols to protocol selection switch positions can be changed in configuration settings as described on the [Compiling and Programming page](Compiling.md). -##Binding in PPM mode +## Binding in PPM mode In PPM mode follow the standard transmitter - receiver binding process: 1. Switch off the transmitter @@ -41,17 +41,17 @@ In PPM mode follow the standard transmitter - receiver binding process: If you are having trouble binding to a consumer quad check the section below on [Getting your Bind Timing right](Bind_Timing.md). For more details on setting up specific receivers or models, check out the [Protocol Details page](Protocol_Details.md). -##Telemetry in PPM mode +## Telemetry in PPM mode Telemetry is available as a serial stream on the TX pin of the Atmega328p in the FrSky HUB format. The serial parameters are based on the protocol selected by the protocol selection dial. Protocol|Serial Parameters ---------|----------------- +---|--- Hubsan|9600bps 8n1 FrSkyD|9600bps 8n1 FrSkyX|57,600bps 8n1 DSM2/X|125,000bps 8n1 -The serial stream is also available on pin 5 of the Module connector (pins numbered from top to bottom) on the [4-in-1 module]() and the [V2.3d modules]() provided the Tx jumper has been soldered. See the linked module documentation for what this means. +The serial stream is also available on pin 5 of the Module connector (pins numbered from top to bottom) on the [4-in-1 module](Module_BG_4-in-1.md) and the [V2.3d modules](Module_Build_yourself_PCB.md#atmega-board-v23d) provided the Tx jumper has been soldered. See the linked module documentation for what this means. You can connect it to your TX if it is telemetry enabled or use a bluetooth adapter (HC05/HC06) along with an app on your phone/tablet [(app example)](https://play.google.com/store/apps/details?id=biz.onomato.frskydash&hl=fr) to display telemetry information and setup alerts. From 1c4174431e2c04577605924005e03a2e8ca529e2 Mon Sep 17 00:00:00 2001 From: Sebastien Charpentier Date: Wed, 19 Apr 2017 14:48:46 +0200 Subject: [PATCH 064/121] Update README-old.md Fixed broken links. --- docs/README-old.md | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/docs/README-old.md b/docs/README-old.md index ceb1c4e..571b102 100644 --- a/docs/README-old.md +++ b/docs/README-old.md @@ -12,15 +12,15 @@ The source code is partly based on the Deviation TX project, thanks to all the d ## Contents -[Compatible TX](https://github.com/pascallanger/DIY-Multiprotocol-TX-Module#compatible-tx) +[Compatible TX](README-old.md#compatible-tx) -[Protocols](https://github.com/pascallanger/DIY-Multiprotocol-TX-Module#protocols) +[Protocols](README-old.md#protocols) -[Hardware](https://github.com/pascallanger/DIY-Multiprotocol-TX-Module#hardware) +[Hardware](README-old.md#hardware) -[Compilation and programmation](https://github.com/pascallanger/DIY-Multiprotocol-TX-Module#compilation-and-programmation) +[Compilation and programmation](README-old.md#compilation-and-programmation) -[Troubleshooting](https://github.com/pascallanger/DIY-Multiprotocol-TX-Module#troubleshooting) +[Troubleshooting](README-old.md#troubleshooting) ## Compatible TX @@ -293,9 +293,7 @@ This module can be purchased [here](http://www.banggood.com/2_4G-CC2500-A7105-Fl If you want to enable serial mode for er9x/ersky9x/Taranis/... and depending on your board revision, you have to do one of these modifications: - 1st revision, add 2 resistors as shown here: ![Screenshot](http://static.rcgroups.net/forums/attachments/4/0/8/5/8/3/a8895038-170-4in1%20module.jpg) -- 2nd revision, solder pads together as shown: - - +- 2nd revision, solder pads together as shown:
Note: if you have the 1st board revision (check pictures above), sometime bind occures at power up even without pressing the bind button or not having an autobind protocol. To solve this issue, replacing the BIND led resistor (on the board back) of 1.2K by a 4.7K. From f5e4fc5a3d22249961c3051b8fc3220d022b124d Mon Sep 17 00:00:00 2001 From: Sebastien Charpentier Date: Wed, 19 Apr 2017 14:51:49 +0200 Subject: [PATCH 065/121] Update README.md Correct typo. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e9d210e..803bd40 100644 --- a/README.md +++ b/README.md @@ -18,8 +18,8 @@ The source code is partly based on the [Deviation TX project](http://www.deviati 1. [Transmitters and serial/telemetry options](docs/Transmitters.md) 1. [Module Hardware options](docs/Hardware.md) 1. Compiling and programming the module - * [4in1/DIY Mutliprotocol module based on ATmega328](docs/Compiling.md) - * [DIY Mutliprotocol module based on STM32](docs/Compiling_STM32.md) + * [4in1/DIY Multiprotocol module based on ATmega328](docs/Compiling.md) + * [DIY Multiprotocol module based on STM32](docs/Compiling_STM32.md) 1. [Transmitter Setup](docs/Transmitters.md) 1. [How to for popular models](docs/Models.md) 1. [Troubleshooting](docs/Troubleshooting.md) From 4d7c31cfa10de28a2057a5e47e07a22a305a9b58 Mon Sep 17 00:00:00 2001 From: Sebastien Charpentier Date: Wed, 19 Apr 2017 14:56:48 +0200 Subject: [PATCH 066/121] Update Compiling.md Fixed **Boards.txt** alignment. Fixed **On Mac OSX** section. --- docs/Compiling.md | 67 +++++++++++++++++++++++------------------------ 1 file changed, 33 insertions(+), 34 deletions(-) diff --git a/docs/Compiling.md b/docs/Compiling.md index 5f3b080..5afc4a2 100644 --- a/docs/Compiling.md +++ b/docs/Compiling.md @@ -111,45 +111,44 @@ First, we need to append some text to the Arduino file boards.txt. 1. Search Windows for the application WordPad (DO NOT USE Notepad).
Right click on WordPad and select "Run as Administrator":

1. Open the file ```boards.txt``` located in this folder ```C:\Program Files(x86)\Arduino\hardware\arduino\avr ``` or the equivalent if you have installed Aduino in a different directory. 1. Append the following text into the end of the file and save it: - -``` -############################################################## -## Multi 4-in-1 (3.3V, 16 MHz) w/ ATmega328 -## -------------------------------------------------- -multi.name=Multi 4-in-1 - -multi.upload.tool=avrdude -multi.upload.protocol=arduino - -multi.bootloader.tool=avrdude -multi.bootloader.unlock_bits=0x3F -multi.bootloader.lock_bits=0x0F - -multi.build.board=AVR_PRO -multi.build.core=arduino -multi.build.variant=eightanaloginputs -multi.build.extra_flags=-Wl,--relax - -multi.menu.cpu.16MHzatmega328=ATmega328 (3.3V, 16 MHz) - -multi.menu.cpu.16MHzatmega328.upload.maximum_size=32768 -multi.menu.cpu.16MHzatmega328.upload.maximum_data_size=2048 -multi.menu.cpu.16MHzatmega328.upload.speed=57600 - -multi.menu.cpu.16MHzatmega328.bootloader.low_fuses=0xFF -multi.menu.cpu.16MHzatmega328.bootloader.high_fuses=0xD3 -multi.menu.cpu.16MHzatmega328.bootloader.extended_fuses=0xFD - -multi.menu.cpu.16MHzatmega328.build.mcu=atmega328p -multi.menu.cpu.16MHzatmega328.build.f_cpu=16000000L -############################################################## -``` + ``` + ############################################################## + ## Multi 4-in-1 (3.3V, 16 MHz) w/ ATmega328 + ## -------------------------------------------------- + multi.name=Multi 4-in-1 + + multi.upload.tool=avrdude + multi.upload.protocol=arduino + + multi.bootloader.tool=avrdude + multi.bootloader.unlock_bits=0x3F + multi.bootloader.lock_bits=0x0F + + multi.build.board=AVR_PRO + multi.build.core=arduino + multi.build.variant=eightanaloginputs + multi.build.extra_flags=-Wl,--relax + + multi.menu.cpu.16MHzatmega328=ATmega328 (3.3V, 16 MHz) + + multi.menu.cpu.16MHzatmega328.upload.maximum_size=32768 + multi.menu.cpu.16MHzatmega328.upload.maximum_data_size=2048 + multi.menu.cpu.16MHzatmega328.upload.speed=57600 + + multi.menu.cpu.16MHzatmega328.bootloader.low_fuses=0xFF + multi.menu.cpu.16MHzatmega328.bootloader.high_fuses=0xD3 + multi.menu.cpu.16MHzatmega328.bootloader.extended_fuses=0xFD + + multi.menu.cpu.16MHzatmega328.build.mcu=atmega328p + multi.menu.cpu.16MHzatmega328.build.f_cpu=16000000L + ############################################################## + ``` #### On Mac OSX: 1. Close the Arduino IDE 1. Using finder navigate to ```Applications``` folder 1. Ctl-Click on the Arduino application and select **Show Package Contents**. -1. Browse to ```Contents/Java/hardware/arduino/avr`` and double click on boards.txt +1. Browse to ```Contents/Java/hardware/arduino/avr``` and double click on boards.txt 1. Copy and paste the "Multi 4-in-1" text listed above into the end of the file and save it. ### Burn Bootloader From 7e06a57fd915581e20b79e8cbcde8bf8ab24f4d1 Mon Sep 17 00:00:00 2001 From: Sebastien Charpentier Date: Wed, 19 Apr 2017 15:00:19 +0200 Subject: [PATCH 067/121] Update Compiling_STM32.md Cosmetic fix. --- docs/Compiling_STM32.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/Compiling_STM32.md b/docs/Compiling_STM32.md index 65e5db8..785e7c3 100644 --- a/docs/Compiling_STM32.md +++ b/docs/Compiling_STM32.md @@ -29,7 +29,7 @@ Flashing precompiled **binaries** is done very simple with the cable setup prese ### Prepare the Arduino IDE: 1. In order to compile successfully you need also to modify a maple library file. In ```....\hardware\Arduino_STM32\STM32F1\cores\maple\libmaple\usart_f1.c``` comment out the 2 functions as shown below. This is required to have low-level access to the USART interrupt.
- ```C + ``` /* void __irq_usart2(void){ usart_irq(&usart2_rb, USART2_BASE); } @@ -75,7 +75,7 @@ See below my module for reference #### Option 2: Flashing with USB cable. This method use USB connector on the STM32 V1.0 board or on the maple clone board. -1. Install first maple USB driver by running the batch file found in Arduino STM32 package folder "..\hardware\Arduino_STM32\drivers\win\install_drivers.bat" +1. Install first maple USB driver by running the batch file found in Arduino STM32 package folder ```..\hardware\Arduino_STM32\drivers\win\install_drivers.bat``` 1. Download the free STM32 flash loader demonstrator from [ST.com](http://www.st.com/en/development-tools/flasher-stm32.html) and using a USB-TTL device (like FTDI cable) flash the STM32duino bootloader available from Roger Clark's great STM32 site [here](https://github.com/rogerclarkmelbourne/STM32duino-bootloader/tree/master/STM32F1/binaries) .Use bootloader **generic_boot20_pa1.bin** 1. Open Arduino IDE,browse to multiprotocol folder,load the sketch multiprotocol.ino. 1. In Arduino IDE under "Upload method" select **STM32duino**-bootloader.Click upload ,wait until upload is complete. @@ -86,7 +86,7 @@ Notes: ## Flashing precompiled binaries: -If you want to flash a pre-compiled binary file (like the Release .bin files) you need specialized software and the same FTDI cable setup already posted [here](https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/blob/master/docs/Compiling_STM32.md#option-1-flashing-with-tx-powerhighly-recommended). +If you want to flash a pre-compiled binary file (like the Release .bin files) you need specialized software and the same FTDI cable setup already posted [here](Compiling_STM32.md#option-1-flashing-with-tx-powerhighly-recommended). 1. Set BOOT0 jumper(skip this step if you aready made your own cable ,see above) 1. Connect your 3.3V FTDI cable (USB - TTL serial) to Multiprotocol serial port (RX,TX,GND pins when flashing with TX power). From 12645c19aad603a7c3aa6f38f00ff2d291e2b780 Mon Sep 17 00:00:00 2001 From: Sebastien Charpentier Date: Wed, 19 Apr 2017 15:01:24 +0200 Subject: [PATCH 068/121] Update Compiling_STM32.md Cosmetic fix. --- docs/Compiling_STM32.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/Compiling_STM32.md b/docs/Compiling_STM32.md index 785e7c3..b5f3a16 100644 --- a/docs/Compiling_STM32.md +++ b/docs/Compiling_STM32.md @@ -98,9 +98,7 @@ For uploading binaries(.bin files) there is a specialized software you need to i #### Windows: Download the **ST Flash Loader Demonstrator** from here: http://www.st.com/content/st_com/en/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-programmers/flasher-stm32.html -Run the ST Flash Loader program. There are many tutorials on the web on how to use this program.For example - -[here](http://www.scienceprog.com/flashing-programs-to-stm32-embedded-bootloader) +Run the ST Flash Loader program. There are many tutorials on the web on how to use this program.For example: [here](http://www.scienceprog.com/flashing-programs-to-stm32-embedded-bootloader) #### OSX: To be checked. From 86787b60998bc051e7119a29233767e6a1f1de38 Mon Sep 17 00:00:00 2001 From: Sebastien Charpentier Date: Wed, 19 Apr 2017 15:04:32 +0200 Subject: [PATCH 069/121] Update README.md Change formatting of **_Config.h** --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 803bd40..706f367 100644 --- a/README.md +++ b/README.md @@ -105,7 +105,7 @@ If you are the owner of a transmitter that supports the er9X/erSky9X or OpenTX f 1. Finally, you should visit the setup page for your transmitter by clicking on the link corressponding to your Tx on the [Transmitters](docs/Transmitters.md) page to configure the last few settings before you can fly to your heart’s content!!!!! # Troubleshooting -Visit the [Troubleshooting](docs/Troubleshooting.md) page. Please bear in mind that the MULTI-Module is a complex system of hardware and software and it make take some patience to get it up and running. Also remember that the developers of the system are actual users of the system. This means that at any moment in time the system is working perfectly for them. A corollary to this is that if you are struggling there are likely two scenarios. First, that the problem is with your hardware or with your configuration, second, and much more unlikely but not impossible scenario, is that you are struggling with a new undiscovered bug. (The author of this documentation speaks from experience ;-) Please check the RC Groups forum and search for keywords relating to your problem before posting a reply. When you do post a reply please so humbly and respectfully – you will find many helpful people there. In your reply please include as much relevant information as possible and attach compilation output and _Config.h files as text attachments to keep the forum clean. +Visit the [Troubleshooting](docs/Troubleshooting.md) page. Please bear in mind that the MULTI-Module is a complex system of hardware and software and it make take some patience to get it up and running. Also remember that the developers of the system are actual users of the system. This means that at any moment in time the system is working perfectly for them. A corollary to this is that if you are struggling there are likely two scenarios. First, that the problem is with your hardware or with your configuration, second, and much more unlikely but not impossible scenario, is that you are struggling with a new undiscovered bug. (The author of this documentation speaks from experience ;-) Please check the RC Groups forum and search for keywords relating to your problem before posting a reply. When you do post a reply please so humbly and respectfully – you will find many helpful people there. In your reply please include as much relevant information as possible and attach compilation output and ```_Config.h``` files as text attachments to keep the forum clean. # A final word A very big thanks to all the people who have shared their time so graciously to create this great project. If you come across them on RC Groups, please be kind and show appreciation. In no particular order: * Pascal Langer (rcgroups: hpnuts) From 11b18f74688fdc5655515fc94b4fa177a4b8e287 Mon Sep 17 00:00:00 2001 From: Sebastien Charpentier Date: Wed, 19 Apr 2017 15:08:36 +0200 Subject: [PATCH 070/121] Update Troubleshooting.md Cosmetic amelioration. --- docs/Troubleshooting.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/Troubleshooting.md b/docs/Troubleshooting.md index 73c5c39..c168463 100644 --- a/docs/Troubleshooting.md +++ b/docs/Troubleshooting.md @@ -4,18 +4,18 @@ ### Green LED -- Off: no power to the module -- On: module is powered up +- **_Off_**: no power to the module +- **_On_**: module is powered up ### Red LED (bind LED) -- Off: program not running or a protocol selected with the associated module not installed -- Flash(on=0.05s,off=1s): invalid protocol selected (excluded from compilation or invalid protocol number) -- Inverted Flash(on=1s,off=0.1s): module is waiting for a bind event (Bind from channel or Bind in radio GUI) to launch the protocol in bind mode -- Fast blink(on=0.1s,off=0.1s): bind in progress -- Slow blink(on=0.5s,off=0.5s): serial has been selected but no valid signal is being seen on the RX pin. -- Slower blink(on=1s,off=1s): PPM has been selected but no valid signal is being seen on the PPM pin. -- On: Module is in normal operation mode (transmitting control signals). +- **_Off_**: program not running or a protocol selected with the associated module not installed +- **_Flash(on=0.05s,off=1s)_**: invalid protocol selected (excluded from compilation or invalid protocol number) +- **_Inverted Flash(on=1s,off=0.1s)_**: module is waiting for a bind event (Bind from channel or Bind in radio GUI) to launch the protocol in bind mode +- **_Fast blink(on=0.1s,off=0.1s)_**: bind in progress +- **_Slow blink(on=0.5s,off=0.5s)_**: serial has been selected but no valid signal is being seen on the RX pin. +- **_Slower blink(on=1s,off=1s)_**: PPM has been selected but no valid signal is being seen on the PPM pin. +- **_On_**: Module is in normal operation mode (transmitting control signals). ## Protocol selection From edc58a349692d1b60c2a8daa0d84bb39219c6ac0 Mon Sep 17 00:00:00 2001 From: Sebastien Charpentier Date: Wed, 19 Apr 2017 15:17:11 +0200 Subject: [PATCH 071/121] Update Compiling.md Align pictures int section **Connect the programmer** --- docs/Compiling.md | 26 ++++++-------------------- 1 file changed, 6 insertions(+), 20 deletions(-) diff --git a/docs/Compiling.md b/docs/Compiling.md index 5afc4a2..aeb40c6 100644 --- a/docs/Compiling.md +++ b/docs/Compiling.md @@ -25,26 +25,15 @@ The procedure below will guide you through all the steps to upload successfully ### Connect the programmer -1. Before you connect the programmer make sure that you have selected the 3.3V mode and not 5V. The RF Modules are not 5V tolerant and you will break them with 5V. On most programmers this is done by moving a jumper. - - - +1. Before you connect the programmer make sure that you have selected the 3.3V mode and not 5V. The RF Modules are not 5V tolerant and you will break them with 5V. On most programmers this is done by moving a jumper.
1. Please re-read item 1. above before going on. 1. Turn the rotary switch on the DIY Multiprotocol module to the 0 position. If you do not have a switch for Serial mode only then it is the same as being in the 0 position. The upload will not work if the switch is in any other position. 1. Connect the 6-pin programming connector to the 6-pin ASP IVR connector on the DIY Multiprotocol board. Be sure to match the ground pin of the programmer connector to the ground pin on the board. The images below indicates the pin layout and the location of the ground pin on the board: -* Banggood readymade 4-in-1 module: - - - -* DIY Mulitprotocol modules (like the 2.3d board): - - - -* Arduino Pro Mini module: - - +* Banggood readymade 4-in-1 module:

+* DIY Mulitprotocol modules (like the 2.3d board):

+* Arduino Pro Mini module:

You are now ready to plug in the USB programmer to the computer @@ -59,8 +48,7 @@ If you are looking for a good working USBASP Windows driver, [use this one](http ### Customize the firmware to match your hardware and your needs All customization is done by editing the ```_Config.h ``` file in the Multiprotocol Arduino project. -In the Arduino IDE, click on the down arrow on the far right of the tab bar to show a list of project files (see the red circle on the screenshot below). Scroll down and select the _Config.h file. - +In the Arduino IDE, click on the down arrow on the far right of the tab bar to show a list of project files (see the red circle on the screenshot below). Scroll down and select the _Config.h file.
The file has different sections which are explained in details. The best is to go through them one by one carefully and apply the configuration which matches your needs. @@ -68,9 +56,7 @@ Most of the default settings should get you started quickly. But on modules with To fill in the "PROTOCOLS TO INCLUDE" section, it would be good to review all the available protocols on the [Protocol Details](../Protocols_Details.md) page and identify which one you would like to add on your module. -To check that the program will compile correctly and fit in the Atmega press the Check mark as shown below. - - +To check that the program will compile correctly and fit in the Atmega press the Check mark as shown below.
If you see something like the following, your firmware is still too big and you need to deselect additional protocols: > Sketch uses 34,096 bytes (104%) of program storage space. Maximum is 32,768 bytes. From 1e62c0d8364aba51cfecb8e3d28933989939c069 Mon Sep 17 00:00:00 2001 From: Sebastien Charpentier Date: Wed, 19 Apr 2017 21:00:06 +0200 Subject: [PATCH 072/121] Update Compiling.md Fixed broken link. --- docs/Compiling.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Compiling.md b/docs/Compiling.md index aeb40c6..29a5085 100644 --- a/docs/Compiling.md +++ b/docs/Compiling.md @@ -70,7 +70,7 @@ If there is another error carefully read it, go to the line number indicated and 1. If you have a 4in1 Multiprotocol module you can skip this step. If you've just finished to build your DIY Multiprotocol module (like v2.3d), the first step is to flash the fuses of the microcontroller. This needs to be done only once. For this purpose, click on **Tools -> Burn Bootloader** 1. You are now ready to flash the firmware. In the Arduino IDE click **Sketch -> Upload Using Programmer**. -If the output indicates that the firmware has been uploaded successfully - give yourself a pat on the back. Well done, you have successfully programmed your DIY Multiprotocol module. You can already go to the final step [Setting up your Transmitter](TransmitterSetup.md) and begin to fly!!!! But don't forget to visit the next topic [Advanced settings](#AdvancedSettings) which has some extra steps needed to use your module at his full potential. +If the output indicates that the firmware has been uploaded successfully - give yourself a pat on the back. Well done, you have successfully programmed your DIY Multiprotocol module. You can already go to the final step [Setting up your Transmitter](Transmitters.md#compatible-transmitters) and begin to fly!!!! But don't forget to visit the next topic [Advanced settings](#AdvancedSettings) which has some extra steps needed to use your module at his full potential. **Troubleshooting** From 29e90246d28573267aab9b2386b639b4e0d06b9d Mon Sep 17 00:00:00 2001 From: Sebastien Charpentier Date: Wed, 19 Apr 2017 21:07:14 +0200 Subject: [PATCH 073/121] Update Tx-Taranis.md Fixed list and pictures alignment. --- docs/Tx-Taranis.md | 43 +++++++++++-------------------------------- 1 file changed, 11 insertions(+), 32 deletions(-) diff --git a/docs/Tx-Taranis.md b/docs/Tx-Taranis.md index 567bc9d..c1b4ba4 100644 --- a/docs/Tx-Taranis.md +++ b/docs/Tx-Taranis.md @@ -20,16 +20,11 @@ Please refer to the [PPM Setup](PPM_Setup.md) page. ## Serial mode ### Enabling Serial Mode To operate in serial mode, you need one of these firmwares: - 1. erSky9x - 1. OpenTx supporting the MULTI-Module (Version 2.1.8 Multi or later, 2.2 recommended) - -Check and upload a supported firmware. The latest available version at time of writing are: - - erSky9x Revision 218 or later - the hex files are available [here](http://www.er9x.com) (Mike's latests test versions are available [here](http://openrcforums.com/forum/viewtopic.php?f=7&t=4676)). - - OpenTx 2.2RC10 or later [www.open-tx.org](http://www.open-tx.org/) - - Please make sure that the "multimodule" option in OpenTX Companion is checked: -   -   +1. erSky9x +1. OpenTx supporting the MULTI-Module (Version 2.1.8 Multi or later, 2.2 recommended). Check and upload a supported firmware. The latest available version at time of writing are: + - erSky9x Revision 218 or later - the hex files are available [here](http://www.er9x.com) (Mike's latests test versions are available [here](http://openrcforums.com/forum/viewtopic.php?f=7&t=4676)). + - OpenTx 2.2RC10 or later [www.open-tx.org](http://www.open-tx.org/) + - Please make sure that the "multimodule" option in OpenTX Companion is checked:

Tutorials for uploading new firmware using the SD Card are available [here](http://www.dronetrest.com/t/how-to-upgrade-firmware-for-frsky-taranis-x9d/959) or the CompanionTx or eepe software (recommended) are available [here](http://open-txu.org/home/undergraduate-courses/fund-of-opentx/part-2-flashing-opentx/). @@ -37,15 +32,11 @@ Tutorials for uploading new firmware using the SD Card are available [here](http First, confirm that the MULTI-Module has the required physical connections between the pins on the back of the Tx and the ATMega328 microprocessor. This may require some soldering and depends on which version of the DIY Multiprotocol module you have. Check out the specific pages for your module hardware (under the section "Enabling Serial") linked [here](Hardware.md) for details. - 1. Plug in your MULTI-Module into the transmitter's module bay. - 2. If you have a rotary protocol selection switch, turn the switch to position 0 to put the unit into Serial mode. - 2. Ensure throttle is down and all switches are in the start position and power up the Transmitter. The red LED on the MULTI-Module should be flashing with a period of about 1s indicating that it has not established a valid serial link with the Tx. This is expected as we have not set up the Tx yet. - 3. Create a new model (make sure channel order is AETR - **This is really important - this is for all protocols - even for DSM as the MULTI-module firware will change the transmitted channel order according to the protocol.**) and on the first Model Settings page scroll down to disable the internal RF and enable the external RF by selecting MULTI as the external RF. Your Transmitter settings should look like this: - - or - - The Red LED on the MULTI-Module should briefly flash and then stay on. This confirms that the MULTI-Module module has established serial communication with the Tx. - 4. If the red LED on the module continues to flash at a period of about 1s then it signals that serial communication has not been established. Check your settings under the model menu as described above and check that the protocol selection switch on the module is at 0 (zero). If there is still no communication, power down and power up the Tx. Finally check that you have correctly enabled your module for serial as described in specific pages for your module hardware (under the section "Enabling Serial") linked [here](Hardware.md) +1. Plug in your MULTI-Module into the transmitter's module bay. +1. If you have a rotary protocol selection switch, turn the switch to position 0 to put the unit into Serial mode. +1. Ensure throttle is down and all switches are in the start position and power up the Transmitter. The red LED on the MULTI-Module should be flashing with a period of about 1s indicating that it has not established a valid serial link with the Tx. This is expected as we have not set up the Tx yet. +1. Create a new model (make sure channel order is AETR - **This is really important - this is for all protocols - even for DSM as the MULTI-module firware will change the transmitted channel order according to the protocol.**) and on the first Model Settings page scroll down to disable the internal RF and enable the external RF by selecting MULTI as the external RF. Your Transmitter settings should look like this:

or

The Red LED on the MULTI-Module should briefly flash and then stay on. This confirms that the MULTI-Module module has established serial communication with the Tx. +1. If the red LED on the module continues to flash at a period of about 1s then it signals that serial communication has not been established. Check your settings under the model menu as described above and check that the protocol selection switch on the module is at 0 (zero). If there is still no communication, power down and power up the Tx. Finally check that you have correctly enabled your module for serial as described in specific pages for your module hardware (under the section "Enabling Serial") linked [here](Hardware.md) ### Protocol Selection in Serial mode To select the protocol, scroll through the available options under the Model Settings menu. Depending on which protocol you have selected you may be required to select a sup-protocol and options. For example, the FrSky protocol has three sub-protocols FrSkyV, FrSkyD and FrSkyX. Each of the sub-protocols may have options that specify the number of channels and the packet frame rate, etc. @@ -53,19 +44,7 @@ To select the protocol, scroll through the available options under the Model Set The following picture shows DSM – DSMX – Option 6 (6 channels and 11ms frame rate). Check out the [Protocol Details](Protocol_Details.md) page for detailed information and suggestions regarding the sub-protocols and options. ### Protcol Status in Serial mode (OpenTX) -If you see ```NO MULTI_TELEMETRY``` or no ```NO TELEMETRY``` in the setup screen of the external module, like this: - - - -you are missing the ```MULTI_TELEMETRY``` and/or ```INVERT_TELEMTRY``` option in your ```_Config.h``` and/or [you need to hardware modifications to enable telemetry](Hardware.md). OpenTX also shows the ```NO TELEMETRY``` message if no module status has been received in the last 2s which can indicate a non working module if the telemetry status worked before. With the option enabled, the right telemetry type is automatically detected and you will see the status of the module: - - - -(Selected protocol is not available, most probably mssing from ```_Config.h```) - - - -(Module is currently binding and code on the module is running V1.1.6.10) +If you see ```NO MULTI_TELEMETRY``` or no ```NO TELEMETRY``` in the setup screen of the external module, like this:

you are missing the ```MULTI_TELEMETRY``` and/or ```INVERT_TELEMTRY``` option in your ```_Config.h``` and/or [you need to hardware modifications to enable telemetry](Hardware.md). OpenTX also shows the ```NO TELEMETRY``` message if no module status has been received in the last 2s which can indicate a non working module if the telemetry status worked before. With the option enabled, the right telemetry type is automatically detected and you will see the status of the module:

(Selected protocol is not available, most probably mssing from ```_Config.h```)

(Module is currently binding and code on the module is running V1.1.6.10) ### Binding in Serial mode From 4e518bf70cd032a93d91b14ef01180b45adf0d29 Mon Sep 17 00:00:00 2001 From: Sebastien Charpentier Date: Wed, 19 Apr 2017 21:09:29 +0200 Subject: [PATCH 074/121] Update Tx-Taranis.md Corrected explanation. --- docs/Tx-Taranis.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/Tx-Taranis.md b/docs/Tx-Taranis.md index c1b4ba4..17c01ef 100644 --- a/docs/Tx-Taranis.md +++ b/docs/Tx-Taranis.md @@ -20,10 +20,9 @@ Please refer to the [PPM Setup](PPM_Setup.md) page. ## Serial mode ### Enabling Serial Mode To operate in serial mode, you need one of these firmwares: -1. erSky9x +1. erSky9x Revision 218 or later - the hex files are available [here](http://www.er9x.com) (Mike's latests test versions are available [here](http://openrcforums.com/forum/viewtopic.php?f=7&t=4676)). 1. OpenTx supporting the MULTI-Module (Version 2.1.8 Multi or later, 2.2 recommended). Check and upload a supported firmware. The latest available version at time of writing are: - - erSky9x Revision 218 or later - the hex files are available [here](http://www.er9x.com) (Mike's latests test versions are available [here](http://openrcforums.com/forum/viewtopic.php?f=7&t=4676)). - - OpenTx 2.2RC10 or later [www.open-tx.org](http://www.open-tx.org/) + - OpenTx 2.2RC16 or later [www.open-tx.org](http://www.open-tx.org/) - Please make sure that the "multimodule" option in OpenTX Companion is checked:

Tutorials for uploading new firmware using the SD Card are available [here](http://www.dronetrest.com/t/how-to-upgrade-firmware-for-frsky-taranis-x9d/959) or the CompanionTx or eepe software (recommended) are available [here](http://open-txu.org/home/undergraduate-courses/fund-of-opentx/part-2-flashing-opentx/). From df347be672b92399a9cc96779790877c34f0a445 Mon Sep 17 00:00:00 2001 From: Sebastien Charpentier Date: Wed, 19 Apr 2017 21:10:19 +0200 Subject: [PATCH 075/121] Update Bind_Timing.md MarkDown correction. --- docs/Bind_Timing.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Bind_Timing.md b/docs/Bind_Timing.md index 64cb257..87fcfc1 100644 --- a/docs/Bind_Timing.md +++ b/docs/Bind_Timing.md @@ -1,4 +1,4 @@ -#Getting your Bind timing right. +# Getting your Bind timing right. On many consumer models it it important for the Tx to send a bind signal in a narrow window once the model has powered up. If the bind signal is not recieved during this window, the bind sequence times out. Try this: From f490fa6e7d462b560a3e9954c82cd507cce0854f Mon Sep 17 00:00:00 2001 From: Sebastien Charpentier Date: Wed, 19 Apr 2017 21:14:41 +0200 Subject: [PATCH 076/121] Update Tx-FlyskyTH9X.md Fixed broken link & MarkDown sections. --- docs/Tx-FlyskyTH9X.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/Tx-FlyskyTH9X.md b/docs/Tx-FlyskyTH9X.md index 8147d9f..986e3e0 100644 --- a/docs/Tx-FlyskyTH9X.md +++ b/docs/Tx-FlyskyTH9X.md @@ -1,4 +1,4 @@ -#Flysky TH9X family of transmitters +# Flysky TH9X family of transmitters This page is relevant to the following transmitters: * FlySky TH9X * Turnigy 9X, Turnigy 9XR @@ -19,21 +19,21 @@ Serial mode is only supported by the er9X firmware. Loading this firmware is be er9X is very well documented, see [here](http://openrcforums.com/forum/viewtopic.php?f=5&t=6473#p90349) -###Enabling Serial Mode +### Enabling Serial Mode 1. Confirm that the MULTI-Module has the required physical connections between the pins on the back of the Tx and the ATMega328 microprocessor. This may require some soldering and depends on which version of the MULTI-Module you have. Check out your module’s hardware page under the section **Enabling your MULTI-Module for Serial** for details. Click here for the [hardware](Hardware.md) pages. 1. Plug in your DIY Multiprotocol module into the transmitter module bay. If you have a rotary protocol selection switch, turn the switch to position 0 to put the unit into Serial mode. 1. Ensure throttle is down and all switches are in the start position and power up the Tx. The red LED on the DIY Multiprotocol module should be flashing with a period of about 1 second indicating that it has not established a valid serial link with the Tx. This is expected as we have not set up the Tx yet. -1. Create a new model and confirm that the channel order is set to AETR (**This is really important - this is for all protocols - even for DSM as the MULTI-module firware will change the transmitted channel order according to the protocol.** +1. Create a new model and confirm that the channel order is set to AETR (**This is really important - this is for all protocols - even for DSM as the MULTI-module firware will change the transmitted channel order according to the protocol.** 1. In the Model Settings menu scroll down to change the RF settings to MULTI {mikeb - can you write this line } 1. The red LED on the MULTI-Module should briefly flash and then go off. This confirms that the MULTI-Module has established serial communication with the Tx. If the red LED on the module continues to flash at a period of about 1 seconds then it signals that serial communication has not been established. Check your settings under the model menu as described above and check that the protocol selection switch on the module is at 0 (enable Serial mode). If there is still no communication, power down and power up the Tx. Finally check that you have correctly enabled your module for serial as described on the hardware page for your module under the heading "Enabling your module for Serial". Click here to access the [hardware](Hardware.md) and then click on the picture of your module. -###Protocol Selection in Serial mode +### Protocol Selection in Serial mode To select the protocol: 1. In the Model Setting menu, scroll through the available options under the MULTI option {mikeb to confirm}. - 1. Depending on which protocol you have selected you may be required to select a sup-protocol and options. For example, the FrSky protocol has three sub-protocols FrSky_V, FrSky_D and FrSky_X. In some cases the sub-protocols have options that could specify the number of channels, packet frame rate or fine frequency tuning. Check out the [Protocol Details](Protocol_Details.md) page for detailed information and suggestions regarding the sub-protocols and options. The picture below shows the settings in the erSky Model Setup menu for FrSkyX subprotocol with {mike to insert} options: + 1. Depending on which protocol you have selected you may be required to select a sup-protocol and options. For example, the FrSky protocol has three sub-protocols FrSky_V, FrSky_D and FrSky_X. In some cases the sub-protocols have options that could specify the number of channels, packet frame rate or fine frequency tuning. Check out the [Protocol Details](../Protocols_Details.md) page for detailed information and suggestions regarding the sub-protocols and options. The picture below shows the settings in the erSky Model Setup menu for FrSkyX subprotocol with {mike to insert} options: {mikeb to send simple picture} -###Binding in Serial mode +### Binding in Serial mode 1. Switch on the model or put the receiver into bind mode 1. On the transmitter go to the Model Settings menu and scroll down to the [Bind] menu option and press Enter. 1. Press Enter again to exit Bind mode From fb2a5c23784af630d102dfdbfe2f4ff1480fc900 Mon Sep 17 00:00:00 2001 From: Sebastien Charpentier Date: Wed, 19 Apr 2017 21:16:36 +0200 Subject: [PATCH 077/121] Update Tx-erSky9X.md Fixed MarkDown and broken links. --- docs/Tx-erSky9X.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/Tx-erSky9X.md b/docs/Tx-erSky9X.md index 61cd011..cd52dbe 100644 --- a/docs/Tx-erSky9X.md +++ b/docs/Tx-erSky9X.md @@ -1,4 +1,4 @@ -#erSky9X family of transmitters +# erSky9X family of transmitters This page is relevant to the following transmitters: - Taranis running erSky9X (for the Taranis running OpenTx see [here](Tx-Taranis.md)) - Turnigy 9XR Pro (for Turnigy 9X see [here](Tx-FlyskyTH9X.md)) @@ -21,7 +21,7 @@ Serial mode is only supported by the erSky9X firmware. Loading this firmware is erSky9X is well documented, the slightly outdated erSky9X documentation is [here](http://openrcforums.com/forum/viewtopic.php?f=5&t=6473#p90349). You may find the new Er9x manual very helpful in understanding Ersky9x as the two firmwares are very closely related. It provides more detailed explanations and numerous relevant programming examples and is available [here](http://openrcforums.com/forum/viewtopic.php?f=5&t=6473#p90349). -###Enabling Serial Mode +### Enabling Serial Mode 1. Confirm that the MULTI-Module has the required physical connections between the pins on the back of the Tx and the ATMega328 microprocessor. This may require some soldering and depends on which version of the MULTI-Module you have. Check out your module’s hardware page under the section **Enabling your module for Serial** for details. Click on the image that corresponds to your MULTI-Module on the [hardware](Hardware.md) page. 1. Plug in your MULTI-Module into the transmitter module bay. If you have a rotary protocol selection switch, turn the switch to position 0 to put the unit into Serial mode. 1. Ensure throttle is down and all switches are in the start position and power up the Tx. The red LED on the MULTI-Module should be flashing with a period of about 1 second indicating that it has not established a valid serial link with the Tx. This is expected as we have not set up the Tx yet. @@ -29,13 +29,13 @@ erSky9X is well documented, the slightly outdated erSky9X documentation is [here 1. In the Model Setup menu scroll down to the **Protocol** submenu and change the RF settings to MULTI. This should reveal a set of additional options (like Protocol and Options) 1. The red LED on the MULTI-Module should briefly flash and then remain solid. This confirms that the MULTI-Module has established serial communication with the Tx. If the red LED on the module continues to flash at a period of about 1 seconds then it signals that serial communication has not been established. Check your settings under the model menu as described above and check that the protocol selection switch on the module is at 0 (enable Serial mode). If there is still no communication, power down and power up the Tx. Finally check that you have correctly enabled your module for serial as described on the hardware page for your module under the heading "Enabling your module for Serial". Click here to access the [hardware](Hardware.md) and then click on the picture of your module. -###Protocol Selection in Serial mode +### Protocol Selection in Serial mode To select the protocol: 1. In the Model Setting menu, scroll through the available options under the MULTI protocol - 1. Depending on which protocol you have selected you may be required to select a sup-protocol and options. For example, there are three protocols that correspond to FrSky recievers: FrSky_V, FrSky_D and FrSky_X. In some cases the sub-protocols have options that could specify the number of channels, packet frame rate or fine frequency tuning. Check out the [Protocol Details](Protocol_Details.md) page for detailed information and suggestions regarding the sub-protocols and options. The picture below shows the settings in the erSky Model Setup menu for FrSkyX subprotocol with {mike to insert} options: + 1. Depending on which protocol you have selected you may be required to select a sup-protocol and options. For example, there are three protocols that correspond to FrSky recievers: FrSky_V, FrSky_D and FrSky_X. In some cases the sub-protocols have options that could specify the number of channels, packet frame rate or fine frequency tuning. Check out the [Protocol Details](../Protocols_Details.md) page for detailed information and suggestions regarding the sub-protocols and options. The picture below shows the settings in the erSky Model Setup menu for FrSkyX subprotocol with {mike to insert} options: {mikeb to send simple picture} -###Binding in Serial mode +### Binding in Serial mode 1. Switch on the model or put the receiver into bind mode 1. On the transmitter go to the Model Settings menu and scroll down to the [Bind] menu option and press Enter. 1. Press Enter again to exit Bind mode From 2586e2e66122c3a503fb6ca3a1c832af8f85a5a3 Mon Sep 17 00:00:00 2001 From: Sebastien Charpentier Date: Wed, 19 Apr 2017 21:19:57 +0200 Subject: [PATCH 078/121] Update Documentation_To_Do_List.md Fixed MarkDown --- docs/Documentation_To_Do_List.md | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/docs/Documentation_To_Do_List.md b/docs/Documentation_To_Do_List.md index 827c1fd..c3db0ec 100644 --- a/docs/Documentation_To_Do_List.md +++ b/docs/Documentation_To_Do_List.md @@ -1,14 +1,13 @@ -#Documentation ToDos -1. Documentation on all the FlySky boards: (MikeB?) +# Documentation ToDos +- [ ] Documentation on all the FlySky boards: (MikeB?) - SKY board erSky9x - AR9X board erSky9x - 9Xtreme board erSky9x - AR9X UNI board -1. Add to the troubleshooting page -1. Add how to do custom protocol setup on er9x and OpenTx -1. Document the OrangeRx Transmitter module (Mikeb?) -1. enabling Serial on the DIY PCB page -1. lots of pictures mentioned between the {} markers -1. Someone to add the Build the board from scratch if it is still relevant - -1. Move to atmega specific and add ftdi to stm32 AVR ISP programmer like the popular USBASP programming dongle that is 3.3V safe - available from many sellers on ebay. There are reports that some of the cheap programmers are not safe to use with 3.3V units (like this unit). Look for USBAsp programmers with the “LC Technologies” label. {Pascal to confirm these reports are true} Also, you will need a 10-pin to 6-pin connector to connect the USBASP to the board. +- [ ] Add to the troubleshooting page +- [ ] Add how to do custom protocol setup on er9x and OpenTx +- [ ] Document the OrangeRx Transmitter module (Mikeb?) +- [ ] enabling Serial on the DIY PCB page +- [ ] lots of pictures mentioned between the {} markers +- [ ] Someone to add the Build the board from scratch if it is still relevant +- [ ] Move to atmega specific and add ftdi to stm32 AVR ISP programmer like the popular USBASP programming dongle that is 3.3V safe - available from many sellers on ebay. There are reports that some of the cheap programmers are not safe to use with 3.3V units (like this unit). Look for USBAsp programmers with the “LC Technologies” label. {Pascal to confirm these reports are true} Also, you will need a 10-pin to 6-pin connector to connect the USBASP to the board. From 7e801269afb63c6f29a36342250c4ca45e79f053 Mon Sep 17 00:00:00 2001 From: Sebastien Charpentier Date: Wed, 19 Apr 2017 21:24:42 +0200 Subject: [PATCH 079/121] Update Protocol_Details_old.md Fixed MarkDown. --- docs/Protocol_Details_old.md | 168 +++++++++++++++++++---------------- 1 file changed, 91 insertions(+), 77 deletions(-) diff --git a/docs/Protocol_Details_old.md b/docs/Protocol_Details_old.md index 1fedb2e..7ce127d 100644 --- a/docs/Protocol_Details_old.md +++ b/docs/Protocol_Details_old.md @@ -1,4 +1,4 @@ -#MULTI-Module Protocol Details +# MULTI-Module Protocol Details **You'll find below a detailed description of every supported protocols sorted by RF modules.** Legend: @@ -8,9 +8,9 @@ Legend: The AETR mentionned here for all protocols depends on the TX settings compilation option set in _Config.h. *** -#A7105 RF Module +# A7105 RF Module -##FLYSKY +## FLYSKY Extended limits supported CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 @@ -19,22 +19,22 @@ A|E|T|R|CH5|CH6|CH7|CH8 Note that the RX ouput will be AETR. -###Sub_protocol V9X9 +### Sub_protocol V9X9 CH5|CH6|CH7|CH8 ---|---|---|--- FLIP|LIGHT|PICTURE|VIDEO -###Sub_protocol V6X6 +### Sub_protocol V6X6 CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12 ---|---|---|---|---|---|---|--- FLIP|LIGHT|PICTURE|VIDEO|HEADLESS|RTH|XCAL|YCAL -###Sub_protocol V912 +### Sub_protocol V912 CH5|CH6 ---|--- BTMBTN|TOPBTN -##HUBSAN +## HUBSAN Models: Hubsan H102D, H107/L/C/D and Hubsan H107P/C+/D+ Autobind protocol @@ -47,10 +47,9 @@ CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9 ---|---|---|---|---|---|---|---|--- A|E|T|R|FLIP|LIGHT|PICTURE|VIDEO|HEADLESS -*** -#CC2500 RF Module +# CC2500 RF Module -##FRSKYV = FrSky 1 way +## FRSKYV = FrSky 1 way Models: FrSky receivers V8R4, V8R7 and V8FR. Extended limits supported @@ -61,7 +60,7 @@ CH1|CH2|CH3|CH4 ---|---|---|--- CH1|CH2|CH3|CH4 -##FRSKYD +## FRSKYD Models: FrSky receivers D4R and D8R. DIY RX-F801 and RX-F802 receivers. Extended limits supported @@ -74,7 +73,7 @@ CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 ---|---|---|---|---|---|---|--- CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 -##FRSKYX +## FRSKYX Models: FrSky receivers X4R, X6R and X8R. Extended limits supported @@ -83,17 +82,17 @@ Telemetry enabled for A1 (RxBatt), A2, RSSI, TSSI and Hub Option=fine frequency tuning. This value is different for each board. To determine the option value, find the two limits where the RX loses connection then set the option value to half way between them. If you have a 4in1 V2 board the value is around 40. -###Sub_protocol CH_16 +### Sub_protocol CH_16 CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14|CH15|CH16 ---|---|---|---|---|---|---|---|---|----|----|----|----|----|----|---- CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14|CH15|CH16 -###Sub_protocol CH_8 +### Sub_protocol CH_8 CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 ---|---|---|---|---|---|---|--- CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 -##SFHSS +## SFHSS Models: Futaba RXs and XK models. Option=fine frequency tuning. This value is different for each board. To determine the option value, find the two limits where the RX loses connection then set the option value to half way between them. If you have a 4in1 V2 board the value is around 40. @@ -102,10 +101,9 @@ CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 ---|---|---|---|---|---|---|--- A|E|T|R|CH5|CH6|CH7|CH8 -*** -#CYRF6936 RF Module +# CYRF6936 RF Module -##DEVO +## DEVO Extended limits supported CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 @@ -135,7 +133,7 @@ Bind procedure using PPM: - To verify that the TX is in fixed mode: power cycle the TX, the module LED should be solid ON (no blink). - Note: Autobind/fixed ID mode is linked to the dial number. Which means that you can have multiple dial numbers set to the same protocol DEVO with different RX_Num and have different bind modes at the same time. It enables PPM users to get model match under DEVO. -##DSM +## DSM Extended limits supported Telemetry enabled for TSSI and plugins @@ -150,31 +148,34 @@ Notes: - model/type/number of channels indicated on the RX can be different from what the RX is in fact wanting to see. So don't hesitate to test different combinations until you have something working. Using Auto is the best way to find these settings. - RX ouput will always be TAER independently of the input AETR, RETA... -###Sub_protocol DSM2_22 +### Sub_protocol DSM2_22 DSM2, Resolution 1024, refresh rate 22ms -###Sub_protocol DSM2_11 + +### Sub_protocol DSM2_11 DSM2, Resolution 2048, refresh rate 11ms -###Sub_protocol DSMX_22 + +### Sub_protocol DSMX_22 DSMX, Resolution 2048, refresh rate 22ms -###Sub_protocol DSMX_11 + +### Sub_protocol DSMX_11 DSMX, Resolution 2048, refresh rate 11ms -###Sub_protocol AUTO + +### Sub_protocol AUTO The "AUTO" feature enables the TX to automatically choose what are the best settings for your DSM RX and update your model protocol settings accordingly. The current radio firmware which are able to use the "AUTO" feature are ersky9x (9XR Pro, 9Xtreme, Taranis, ...) and er9x for M128 (9XR) and M2561. For these firmwares, you must have a telemetry enabled TX and you have to make sure you set the Telemetry "Usr proto" to "DSMx". Also on er9x you will need to be sure to match the polarity of the telemetry serial (normal or inverted by bitbashing), while on ersky9x you can set "Invert COM1" accordinlgy. -##J6Pro +## J6Pro CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12 ---|---|---|---|---|---|---|---|---|----|----|---- A|E|T|R|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12 -*** -#NRF24L01 RF Module +# NRF24L01 RF Module -##ASSAN +## ASSAN Extended limits supported CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10 @@ -183,7 +184,7 @@ CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10 The transmitter must be close to the receiver while binding. -##BAYANG +## BAYANG Models: EAchine H8(C) mini, BayangToys X6/X7/X9, JJRC JJ850, Floureon H101 ... Autobind protocol @@ -192,7 +193,7 @@ CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10 ---|---|---|---|---|---|---|---|---|---- A|E|T|R|FLIP|RTH|PICTURE|VIDEO|HEADLESS|INVERTED -##CG023 +## CG023 Models: EAchine CG023/CG031/3D X4 Autobind protocol @@ -201,14 +202,14 @@ CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9 ---|---|---|---|---|---|---|---|--- A|E|T|R|FLIP|LIGHT|PICTURE|VIDEO|HEADLESS -###Sub_protocol YD829 +### Sub_protocol YD829 Models: Attop YD-822/YD-829/YD-829C ... CH5|CH6|CH7|CH8|CH9 ---|---|---|---|--- FLIP||PICTURE|VIDEO|HEADLESS -###Sub_protocol H8_3D +### Sub_protocol H8_3D Models: EAchine H8 mini 3D, JJRC H20/H22 CH5|CH6|CH7|CH8|CH9 @@ -223,7 +224,7 @@ H8 3D: OPT1=RTH then press a direction to enter headless mode (like stock TX), O CAL: calibrate accelerometers -##CX10 +## CX10 Extended limits supported Autobind protocol @@ -234,12 +235,12 @@ A|E|T|R|FLIP|RATE Rate: -100%=rate 1, 0%=rate 2, +100%=rate 3 -###Sub_protocol GREEN +### Sub_protocol GREEN Models: Cheerson CX-10 green pcb Same channels assignement as above. -###Sub_protocol BLUE +### Sub_protocol BLUE Models: Cheerson CX-10 blue pcb & some newer red pcb, CX-10A, CX-10C, CX11, CX12, Floureon FX10, JJRC DHD D1 CH5|CH6|CH7|CH8 @@ -248,13 +249,13 @@ FLIP|RATE|PICTURE|VIDEO Rate: -100%=rate 1, 0%=rate 2, +100%=rate 3 or headless for CX-10A -###Sub_protocol DM007 +### Sub_protocol DM007 CH5|CH6|CH7|CH8|CH9 ---|---|---|---|--- FLIP|MODE|PICTURE|VIDEO|HEADLESS -###Sub_protocol Q282 and Q242 +### Sub_protocol Q282 and Q242 CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12 ---|---|---|---|---|---|---|--- @@ -262,120 +263,129 @@ FLIP|LED|PICTURE|VIDEO|HEADLESS|RTH|XCAL|YCAL Model: JXD 509 is using Q282 with CH12=Start/Stop motors -###Sub_protocol JC3015_1 +### Sub_protocol JC3015_1 CH5|CH6|CH7|CH8 ---|---|---|--- FLIP|MODE|PICTURE|VIDEO -###Sub_protocol JC3015_2 +### Sub_protocol JC3015_2 CH5|CH6|CH7|CH8 ---|---|---|--- FLIP|MODE|LED|DFLIP -###Sub_protocol MK33041 +### Sub_protocol MK33041 CH5|CH6|CH7|CH8|CH9|CH10 ---|---|---|---|---|--- FLIP|MODE|PICTURE|VIDEO|HEADLESS|RTH -##ESKY +## ESKY CH1|CH2|CH3|CH4|CH5|CH6 ---|---|---|---|---|--- A|E|T|R|GYRO|PITCH -##FY326 +## FY326 CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9 ---|---|---|---|---|---|---|---|--- A|E|T|R|FLIP|RTH|HEADLESS|EXPERT|CALIBRATE -##FQ777 +## FQ777 Model: FQ777-124 CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 ---|---|---|---|---|---|---|--- A|E|T|R|FLIP|RTH|HEADLESS|EXPERT -##HISKY +## HISKY CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 ---|---|---|---|---|---|---|--- A|E|T|R|GEAR|PITCH|GYRO|CH8 GYRO: -100%=6G, +100%=3G -###HK310 +### HK310 Models: RX HK-3000, HK3100 and XY3000 (TX are HK-300, HK-310 and TL-3C) CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 ---|---|---|---|---|---|---|--- |||T|R|AUX|T_FSAFE|R_FSAFE|AUX_FSAFE -##KN +## KN CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11 ---|---|---|---|---|---|---|---|---|----|---- A|E|T|R|DR|THOLD|IDLEUP|GYRO|Ttrim|Atrim|Etrim Dual Rate: +100%=full range, Throttle Hold: +100%=hold, Idle Up: +100%=3D, GYRO: -100%=6G, +100%=3G -###Sub_protocol WLTOYS -###Sub_protocol FEILUN +### Sub_protocol WLTOYS + +### Sub_protocol FEILUN Same channels assignement as above. -##HONTAI +## HONTAI Autobind protocol CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11 ---|---|---|---|---|---|---|---|---|----|---- A|E|T|R|FLIP|LED|PICTURE|VIDEO|HEADLESS|RTH|CAL -###Sub_protocol HONTAI -###Sub_protocol JJRCX1 +### Sub_protocol HONTAI + +### Sub_protocol JJRCX1 CH6| ---| ARM| -###Sub_protocol X5C1 clone +### Sub_protocol X5C1 clone -##MJXQ +## MJXQ Autobind protocol CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13 ---|---|---|---|---|---|---|---|---|---|---|---|--- A|E|T|R|FLIP|LED|PICTURE|VIDEO|HEADLESS|RTH|AUTOFLIP|PAN|TILT -###Sub_protocol WLH08 -###Sub_protocol X600 -Only 3 TX IDs available, change RX_Num value 0..2 to cycle through them -###Sub_protocol X800 -Only 3 TX IDs available, change RX_Num value 0..2 to cycle through them -###Sub_protocol H26D -###Sub_protocol E010 +### Sub_protocol WLH08 -##MT99XX +### Sub_protocol X600 +Only 3 TX IDs available, change RX_Num value 0..2 to cycle through them + +### Sub_protocol X800 +Only 3 TX IDs available, change RX_Num value 0..2 to cycle through them + +### Sub_protocol H26D + +### Sub_protocol E010 + +## MT99XX Autobind protocol CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9 ---|---|---|---|---|---|---|---|--- A|E|T|R|FLIP|LED|PICTURE|VIDEO|HEADLESS -###Sub_protocol MT +### Sub_protocol MT Models: MT99xx -###Sub_protocol H7 + +### Sub_protocol H7 Models: Eachine H7, Cheerson CX023 -###Sub_protocol YZ + +### Sub_protocol YZ Model: Yi Zhan i6S Only one model can be flown at the same time since the ID is hardcoded. -###Sub_protocol LS + +### Sub_protocol LS Models: LS114, 124, 215 CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9 ---|---|---|---|---|---|---|---|--- A|E|T|R|FLIP|INVERT|PICTURE|VIDEO|HEADLESS -##Shenqi +## Shenqi Autobind protocol Model: Shenqiwei 1/20 Mini Motorcycle @@ -386,27 +396,27 @@ CH1|CH2|CH3|CH4 Throttle +100%=full forward,0%=stop,-100%=full backward. -##SLT +## SLT Autobind protocol CH1|CH2|CH3|CH4|CH5|CH6 ---|---|---|---|---|--- A|E|T|R|GEAR|PITCH -##Symax +## Symax Autobind protocol CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9 ---|---|---|---|---|---|---|---|--- A|E|T|R|FLIP||PICTURE|VIDEO|HEADLESS -###Sub_protocol SYMAX +### Sub_protocol SYMAX Models: Syma X5C-1/X11/X11C/X12 -###Sub_protocol SYMAX5C +### Sub_protocol SYMAX5C Model: Syma X5C (original) and X2 -##V2X2 +## V2X2 Models: WLToys V202/252/272, JXD 385/388, JJRC H6C, Yizhan Tarantula X6 ... CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11 @@ -417,17 +427,21 @@ PICTURE: also automatic Missile Launcher and Hoist in one direction VIDEO: also Sprayer, Bubbler, Missile Launcher(1), and Hoist in the other dir -##YD717 +## YD717 Autobind protocol CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9 ---|---|---|---|---|---|---|---|--- A|E|T|R|FLIP|LIGHT|PICTURE|VIDEO|HEADLESS -###Sub_protocol YD717 -###Sub_protocol SKYWLKR -###Sub_protocol SYMAX4 -###Sub_protocol XINXUN -###Sub_protocol NIHUI +### Sub_protocol YD717 + +### Sub_protocol SKYWLKR + +### Sub_protocol SYMAX4 + +### Sub_protocol XINXUN + +### Sub_protocol NIHUI Same channels assignement as above. From 2aa5b7917f8060f1850ef72a044de5574a4e8135 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Tue, 2 May 2017 17:28:49 +0200 Subject: [PATCH 080/121] Remove paragraph resulting from the 125% bug in earlier OpenTX versions --- docs/Models.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/docs/Models.md b/docs/Models.md index a197f4d..a9d8293 100644 --- a/docs/Models.md +++ b/docs/Models.md @@ -52,9 +52,6 @@ One of the most annoying functions on the Syma X5C is that the motors stop when ## Binding For telemetry enabled modules, you should just let the remote autodetect the settings. Otherwise choose DSMX 22ms with 6ch or 7ch. To bind the model, keep the transmitter off, power on the Inductrix. Wait until it flashes fast and then power up the Tx and use Bind. -## Tx Setup -Remember that 100% on your transmitter using the MULTI-Module corresponds to 125% on the DSM receiver side. On some functions sending 100% will confuse the model. Conversely 80% on your Tx is interpreted to be 100% at the model. Consider this when implementing the suggestions below. - ### Throttle For Inductrix FPV you might need to adjust the lower end of throttle to be a higher than default, otherwise motors will be spinning on minimal throttle. One way to do this is to set the throttle to 80% output (100% of DSM output) and then to enable the **Throttle Idle Trim Only** under the Model Setup menu. See image below: From 3e8321638427276da9b744084bda2eb13a52892c Mon Sep 17 00:00:00 2001 From: Sebastien Charpentier Date: Fri, 16 Jun 2017 14:01:20 +0200 Subject: [PATCH 081/121] Fixed broken link A extra space was breaking the link to the Hardware.md file. --- docs/Troubleshooting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Troubleshooting.md b/docs/Troubleshooting.md index c168463..e50470e 100644 --- a/docs/Troubleshooting.md +++ b/docs/Troubleshooting.md @@ -28,7 +28,7 @@ ### Input Mode - Serial -- Make sure you have done the serial mods as indicated in the [hardware page for your board] (Hardware.md). +- Make sure you have done the serial mods as indicated in the [hardware page for your board](Hardware.md). - Protocol selection dial must be in the 0 position or leave all 4 selection pins unconnected. - Often the signal is not sent to the module until the transmitter has performed safety checks (like switch and throttle position settings) From 2b265bd1de4c55b0c38a408e295b50120f2f8321 Mon Sep 17 00:00:00 2001 From: Sebastien Charpentier Date: Fri, 16 Jun 2017 14:24:33 +0200 Subject: [PATCH 082/121] Fixed broken link Fixed broken link. Bad idea to use space and ampersand... ;) --- docs/Module_Build_yourself_PCB.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Module_Build_yourself_PCB.md b/docs/Module_Build_yourself_PCB.md index 8c63f0c..84c00ca 100644 --- a/docs/Module_Build_yourself_PCB.md +++ b/docs/Module_Build_yourself_PCB.md @@ -30,7 +30,7 @@ The schematic for the board is [here](#V23D_Schematic). Please note that is is ### STM32 powered PCB 1. The latest STM32 (32-bit) powered PCB V1.0t supporting the 4-in-1 RF module available from OSHPark [here](https://oshpark.com/shared_projects/GX51nEoH). 2. The 4-in-1 RF module is available [here](http://www.banggood.com/DIY-2_4G-CC2500-NRF24L01-A7105-CYRF6936-Multi-RF-4-IN-1-Wireless-Module-p-1046308.html) -1. The schematic and BOM for this board V1.0t and older boards are available [here](BOM_DIY_STM32 & Schematic.md). +1. The schematic and BOM for this board V1.0t and older boards are available ![here](BOM_DIY_STM32%20\&%20Schematic.md). ### Common parts 1. A module case that fits your module like the one [here](https://www.xtremepowersystems.net/proddetail.php?prod=XPS-J1CASE)

or you can 3D print your own from a selection on Thingiverse ([Example 1](http://www.thingiverse.com/thing:1852868) [Example 2](http://www.thingiverse.com/thing:1661833)).
[ ](http://www.thingiverse.com/thing:1852868)
For 9XR/9XR Pro, a new 3D printed module is available which makes use of the built in antenna in the handle. This means nothing is getting out of the radio back! You can find all details of this module case on [Thingiverse](http://www.thingiverse.com/thing:2050717).
From 005c7b9cb07d54881f611606a6f98baf6ecd8c27 Mon Sep 17 00:00:00 2001 From: Sebastien Charpentier Date: Fri, 16 Jun 2017 14:25:32 +0200 Subject: [PATCH 083/121] Typo --- docs/Module_Build_yourself_PCB.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Module_Build_yourself_PCB.md b/docs/Module_Build_yourself_PCB.md index 84c00ca..d769da7 100644 --- a/docs/Module_Build_yourself_PCB.md +++ b/docs/Module_Build_yourself_PCB.md @@ -30,7 +30,7 @@ The schematic for the board is [here](#V23D_Schematic). Please note that is is ### STM32 powered PCB 1. The latest STM32 (32-bit) powered PCB V1.0t supporting the 4-in-1 RF module available from OSHPark [here](https://oshpark.com/shared_projects/GX51nEoH). 2. The 4-in-1 RF module is available [here](http://www.banggood.com/DIY-2_4G-CC2500-NRF24L01-A7105-CYRF6936-Multi-RF-4-IN-1-Wireless-Module-p-1046308.html) -1. The schematic and BOM for this board V1.0t and older boards are available ![here](BOM_DIY_STM32%20\&%20Schematic.md). +1. The schematic and BOM for this board V1.0t and older boards are available [here](BOM_DIY_STM32%20\&%20Schematic.md). ### Common parts 1. A module case that fits your module like the one [here](https://www.xtremepowersystems.net/proddetail.php?prod=XPS-J1CASE)

or you can 3D print your own from a selection on Thingiverse ([Example 1](http://www.thingiverse.com/thing:1852868) [Example 2](http://www.thingiverse.com/thing:1661833)).
[ ](http://www.thingiverse.com/thing:1852868)
For 9XR/9XR Pro, a new 3D printed module is available which makes use of the built in antenna in the handle. This means nothing is getting out of the radio back! You can find all details of this module case on [Thingiverse](http://www.thingiverse.com/thing:2050717).
From f95ca6eac68396bad65cd32bb9bd9af88a12829a Mon Sep 17 00:00:00 2001 From: midelic Date: Tue, 27 Jun 2017 11:42:32 +0100 Subject: [PATCH 084/121] info on compiling firmware for USB version --- docs/Compiling_STM32.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/Compiling_STM32.md b/docs/Compiling_STM32.md index b5f3a16..e17e21f 100644 --- a/docs/Compiling_STM32.md +++ b/docs/Compiling_STM32.md @@ -77,12 +77,13 @@ See below my module for reference This method use USB connector on the STM32 V1.0 board or on the maple clone board. 1. Install first maple USB driver by running the batch file found in Arduino STM32 package folder ```..\hardware\Arduino_STM32\drivers\win\install_drivers.bat``` 1. Download the free STM32 flash loader demonstrator from [ST.com](http://www.st.com/en/development-tools/flasher-stm32.html) and using a USB-TTL device (like FTDI cable) flash the STM32duino bootloader available from Roger Clark's great STM32 site [here](https://github.com/rogerclarkmelbourne/STM32duino-bootloader/tree/master/STM32F1/binaries) .Use bootloader **generic_boot20_pa1.bin** -1. Open Arduino IDE,browse to multiprotocol folder,load the sketch multiprotocol.ino. +1. Open Arduino IDE,browse to multiprotocol folder,load the sketch multiprotocol.ino.Select the serial COM port(see notes below) 1. In Arduino IDE under "Upload method" select **STM32duino**-bootloader.Click upload ,wait until upload is complete. Notes: -- When you use multiSTM32_USB for the first time,the USB drivers are not recognized and port is not open/recognized(arduino IDE port selection is grey/unavailable). After this first time use, any subsequent update of the program, you'll have to select the correct serial port and upload sketches normally in Arduino using USB port. +- When you use multiSTM32_USB for the first time,the USB drivers are not recognized and com port is not open/recognized(arduino IDE port selection is grey/unavailable). After this first time use, any subsequent update of the program, you'll have to select the correct serial port and upload sketches normally in Arduino using USB port. - If the initial upload fails, make sure you are running the latest [Java version](https://www.java.com/en/download/) +- If using Banggood multi_STM32-USB module follow instructions from step3(as the USB drivers are probably already installed) ## Flashing precompiled binaries: From 08f9176f3f5ccd86950f59aa711a024d91e54e05 Mon Sep 17 00:00:00 2001 From: midelic Date: Tue, 27 Jun 2017 13:00:38 +0100 Subject: [PATCH 085/121] Update Compiling_STM32.md --- docs/Compiling_STM32.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Compiling_STM32.md b/docs/Compiling_STM32.md index e17e21f..370a4a5 100644 --- a/docs/Compiling_STM32.md +++ b/docs/Compiling_STM32.md @@ -83,7 +83,7 @@ This method use USB connector on the STM32 V1.0 board or on the maple clone boar Notes: - When you use multiSTM32_USB for the first time,the USB drivers are not recognized and com port is not open/recognized(arduino IDE port selection is grey/unavailable). After this first time use, any subsequent update of the program, you'll have to select the correct serial port and upload sketches normally in Arduino using USB port. - If the initial upload fails, make sure you are running the latest [Java version](https://www.java.com/en/download/) -- If using Banggood multi_STM32-USB module follow instructions from step3(as the USB drivers are probably already installed) +- If using Banggood multi_STM32-USB module follow instructions from step1(USB drivers on your computer) and jump after to step 3(most probably bootloader is installed on multi and no need installed again) ## Flashing precompiled binaries: From c50b5d93d7d4486d553affb23773fd380ea22ab9 Mon Sep 17 00:00:00 2001 From: ScottJD Date: Tue, 27 Jun 2017 17:58:43 -0400 Subject: [PATCH 086/121] Update BOM_DIY_STM32 & Schematic.md Added Digi-Key shared carts for latest build BOM. Need to confirm if SV202,SV203, and SV204 each need a strip of 40 header pins for a total of 120 pins as currently since each S1011EC-40-ND part has 40 pins? --- docs/BOM_DIY_STM32 & Schematic.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/BOM_DIY_STM32 & Schematic.md b/docs/BOM_DIY_STM32 & Schematic.md index 123ed49..d4b3e16 100644 --- a/docs/BOM_DIY_STM32 & Schematic.md +++ b/docs/BOM_DIY_STM32 & Schematic.md @@ -7,6 +7,7 @@ All diagrams and eagle files are available [here](https://github.com/pascallange If you are looking for the BOM for the DIY ATmega328 3.2d version click [here](BOM_DIY_ATmega.md). Digikey may not be your preferred supplier, but you should find enough information on their page to cross reference parts. +If digikey is your prefered supplier, their is a link to shared carts to make checkout easier at the begining of the BOM. ## IMPORTANT NOTE on Telemetry In the case of the Turnigy 9X/9XR/9XR Pro you don't need to invert the telemetry signal therefore the instalation of the inverter chip SN74LVC2G86DCTR is **OPTIONAL**. In this case and in order to have telemetry you need to solder **SJ1/SJ301** on the back of the board depending on which board version you have. @@ -26,6 +27,12 @@ The board is available at OSHpark [here](https://oshpark.com/shared_projects/GX5 +Digikey BOM shared cart for building 1 module [here](http://www.digikey.com/short/3dn71h) + +Digikey BOM shared cart for building 3 modules [here](http://www.digikey.com/short/3dnt2r) + +Please Note - With the Digikey shared carts it is cheaper to order 10 piece stips with some parts like resistors and capacitors. These extra parts are not reflected or needed in the followong BOM list. + Qty|Part|Description|Value|Package|Digikey Part Number ---|----|-----------|-----|-------|------------------- 1|J301|Receptacle|5-pin||[WM3103-ND](http://www.digikey.com/product-search/en?keywords=WM3103-ND) From 97a3c8dca17eb84be663061297fdaf8857aecce8 Mon Sep 17 00:00:00 2001 From: midelic Date: Sat, 1 Jul 2017 15:52:34 +0100 Subject: [PATCH 087/121] added more info on flashing USB module. --- docs/Compiling_STM32.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/Compiling_STM32.md b/docs/Compiling_STM32.md index 370a4a5..e1536d4 100644 --- a/docs/Compiling_STM32.md +++ b/docs/Compiling_STM32.md @@ -82,8 +82,9 @@ This method use USB connector on the STM32 V1.0 board or on the maple clone boar Notes: - When you use multiSTM32_USB for the first time,the USB drivers are not recognized and com port is not open/recognized(arduino IDE port selection is grey/unavailable). After this first time use, any subsequent update of the program, you'll have to select the correct serial port and upload sketches normally in Arduino using USB port. +- More explanations how all these work you find [here](http://www.stm32duino.com/viewtopic.php?f=32&t=1774_) - If the initial upload fails, make sure you are running the latest [Java version](https://www.java.com/en/download/) -- If using Banggood multi_STM32-USB module follow instructions from step1(USB drivers on your computer) and jump after to step 3(most probably bootloader is installed on multi and no need installed again) +- If using Banggood multiSTM32_USB module, follow instructions from step1(USB drivers on your computer) and jump after, to step 3(most probably generic bootloader is installed on multi module and no need to be installed again).I don't have one for test so this is an educated guess. ## Flashing precompiled binaries: From 46240751127e8ba02486780f4c028732bef78288 Mon Sep 17 00:00:00 2001 From: hexfet Date: Sat, 22 Jul 2017 22:07:42 -0400 Subject: [PATCH 088/121] Update sequence number logic to send invalid sequence indicator when invalid sequence detected. Works to resync telemetry stream as tested with EU firmware version. --- Multiprotocol/FrSkyX_cc2500.ino | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Multiprotocol/FrSkyX_cc2500.ino b/Multiprotocol/FrSkyX_cc2500.ino index 3d69d08..6af6a34 100644 --- a/Multiprotocol/FrSkyX_cc2500.ino +++ b/Multiprotocol/FrSkyX_cc2500.ino @@ -156,6 +156,8 @@ static void __attribute__((unused)) frskyX_data_frame() seq_last_sent = (seq_last_sent + 1) % 4; else if (seq_last_rcvd == 0x00) seq_last_sent = 1; + else + seq_last_rcvd = 8; if(sub_protocol & 1 )// in X8 mode send only 8ch every 9ms lpass = 0 ; @@ -281,4 +283,4 @@ uint16_t initFrSkyX() seq_last_rcvd = 8; return 10000; } -#endif \ No newline at end of file +#endif From 44a086a27b00d1a08647744d57fc85220d019463 Mon Sep 17 00:00:00 2001 From: hexfet Date: Sat, 22 Jul 2017 22:35:43 -0400 Subject: [PATCH 089/121] Revert terminating newline. --- Multiprotocol/FrSkyX_cc2500.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Multiprotocol/FrSkyX_cc2500.ino b/Multiprotocol/FrSkyX_cc2500.ino index 6af6a34..0085b6a 100644 --- a/Multiprotocol/FrSkyX_cc2500.ino +++ b/Multiprotocol/FrSkyX_cc2500.ino @@ -283,4 +283,4 @@ uint16_t initFrSkyX() seq_last_rcvd = 8; return 10000; } -#endif +#endif \ No newline at end of file From ebf0c4fae6a74898f73e57deb49da784e7a39c0a Mon Sep 17 00:00:00 2001 From: hexfet Date: Sat, 22 Jul 2017 22:39:26 -0400 Subject: [PATCH 090/121] Change spaces to tabs. --- Multiprotocol/FrSkyX_cc2500.ino | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Multiprotocol/FrSkyX_cc2500.ino b/Multiprotocol/FrSkyX_cc2500.ino index 0085b6a..3381e88 100644 --- a/Multiprotocol/FrSkyX_cc2500.ino +++ b/Multiprotocol/FrSkyX_cc2500.ino @@ -156,8 +156,8 @@ static void __attribute__((unused)) frskyX_data_frame() seq_last_sent = (seq_last_sent + 1) % 4; else if (seq_last_rcvd == 0x00) seq_last_sent = 1; - else - seq_last_rcvd = 8; + else + seq_last_rcvd = 8; if(sub_protocol & 1 )// in X8 mode send only 8ch every 9ms lpass = 0 ; @@ -283,4 +283,4 @@ uint16_t initFrSkyX() seq_last_rcvd = 8; return 10000; } -#endif \ No newline at end of file +#endif From a1fb4a0ac5e9009179025c08bef06c882496b2fa Mon Sep 17 00:00:00 2001 From: hexfet Date: Sat, 22 Jul 2017 22:41:34 -0400 Subject: [PATCH 091/121] Revert terminating newline. --- Multiprotocol/FrSkyX_cc2500.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Multiprotocol/FrSkyX_cc2500.ino b/Multiprotocol/FrSkyX_cc2500.ino index 3381e88..84594b4 100644 --- a/Multiprotocol/FrSkyX_cc2500.ino +++ b/Multiprotocol/FrSkyX_cc2500.ino @@ -283,4 +283,4 @@ uint16_t initFrSkyX() seq_last_rcvd = 8; return 10000; } -#endif +#endif \ No newline at end of file From af88abb13fb63cc2cc399b4bd3b72d4747b7a7cf Mon Sep 17 00:00:00 2001 From: pascallanger Date: Mon, 20 Nov 2017 15:53:00 +0100 Subject: [PATCH 092/121] Delete FrSkyX_cc2500.ino --- Multiprotocol/FrSkyX_cc2500.ino | 286 -------------------------------- 1 file changed, 286 deletions(-) delete mode 100644 Multiprotocol/FrSkyX_cc2500.ino diff --git a/Multiprotocol/FrSkyX_cc2500.ino b/Multiprotocol/FrSkyX_cc2500.ino deleted file mode 100644 index 84594b4..0000000 --- a/Multiprotocol/FrSkyX_cc2500.ino +++ /dev/null @@ -1,286 +0,0 @@ - -/* ************************** - * By Midelic on RCGroups * - ************************** - This project is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Multiprotocol is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Multiprotocol. If not, see . -*/ - -#if defined(FRSKYX_CC2500_INO) - -#include "iface_cc2500.h" - -uint8_t chanskip; -uint8_t seq_last_sent; -uint8_t seq_last_rcvd; - -static void __attribute__((unused)) set_start(uint8_t ch ) -{ - CC2500_Strobe(CC2500_SIDLE); - CC2500_WriteReg(CC2500_25_FSCAL1, calData[ch]); - CC2500_WriteReg(CC2500_0A_CHANNR, hopping_frequency[ch]); -} - -static void __attribute__((unused)) frskyX_init() -{ - FRSKY_init_cc2500((sub_protocol&2)?FRSKYXEU_cc2500_conf:FRSKYX_cc2500_conf); // LBT or FCC - // - for(uint8_t c=0;c < 48;c++) - {//calibrate hop channels - CC2500_Strobe(CC2500_SIDLE); - CC2500_WriteReg(CC2500_0A_CHANNR,hopping_frequency[c]); - CC2500_Strobe(CC2500_SCAL); - delayMicroseconds(900);// - calData[c] = CC2500_ReadReg(CC2500_25_FSCAL1); - } - //#######END INIT######## -} - -static void __attribute__((unused)) initialize_data(uint8_t adr) -{ - CC2500_WriteReg(CC2500_0C_FSCTRL0,option); // Frequency offset hack - CC2500_WriteReg(CC2500_18_MCSM0, 0x8); - CC2500_WriteReg(CC2500_09_ADDR, adr ? 0x03 : rx_tx_addr[3]); - CC2500_WriteReg(CC2500_07_PKTCTRL1,0x05); -} - -//**CRC** -const uint16_t PROGMEM CRC_Short[]={ - 0x0000, 0x1189, 0x2312, 0x329B, 0x4624, 0x57AD, 0x6536, 0x74BF, - 0x8C48, 0x9DC1, 0xAF5A, 0xBED3, 0xCA6C, 0xDBE5, 0xE97E, 0xF8F7 }; -static uint16_t CRCTable(uint8_t val) -{ - uint16_t word ; - word = pgm_read_word(&CRC_Short[val&0x0F]) ; - val /= 16 ; - return word ^ (0x1081 * val) ; -} -static uint16_t __attribute__((unused)) crc_x(uint8_t *data, uint8_t len) -{ - uint16_t crc = 0; - for(uint8_t i=0; i < len; i++) - crc = (crc<<8) ^ CRCTable((uint8_t)(crc>>8) ^ *data++); - return crc; -} - - // 0-2047, 0 = 817, 1024 = 1500, 2047 = 2182 - //64=860,1024=1500,1984=2140//Taranis 125% - -static uint16_t __attribute__((unused)) scaleForPXX( uint8_t i ) -{ //mapped 860,2140(125%) range to 64,1984(PXX values); - return (uint16_t)(((Servo_data[i]-servo_min_125)*3)>>1)+64; -} - -static void __attribute__((unused)) frskyX_build_bind_packet() -{ - packet[0] = (sub_protocol & 2 ) ? 0x20 : 0x1D ; // LBT or FCC - packet[1] = 0x03; - packet[2] = 0x01; - // - packet[3] = rx_tx_addr[3]; - packet[4] = rx_tx_addr[2]; - int idx = ((state -FRSKY_BIND) % 10) * 5; - packet[5] = idx; - packet[6] = hopping_frequency[idx++]; - packet[7] = hopping_frequency[idx++]; - packet[8] = hopping_frequency[idx++]; - packet[9] = hopping_frequency[idx++]; - packet[10] = hopping_frequency[idx++]; - packet[11] = 0x02; - packet[12] = RX_num; - // - uint8_t limit = (sub_protocol & 2 ) ? 31 : 28 ; - memset(&packet[13], 0, limit - 13); - uint16_t lcrc = crc_x(&packet[3], limit-3); - // - packet[limit++] = lcrc >> 8; - packet[limit] = lcrc; - // -} - -static void __attribute__((unused)) frskyX_data_frame() -{ - //0x1D 0xB3 0xFD 0x02 0x56 0x07 0x15 0x00 0x00 0x00 0x04 0x40 0x00 0x04 0x40 0x00 0x04 0x40 0x00 0x04 0x40 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x96 0x12 - // - static uint8_t lpass; - uint16_t chan_0 ; - uint16_t chan_1 ; - uint8_t startChan = 0; - // - packet[0] = (sub_protocol & 2 ) ? 0x20 : 0x1D ; // LBT or FCC - packet[1] = rx_tx_addr[3]; - packet[2] = rx_tx_addr[2]; - packet[3] = 0x02; - // - packet[4] = (chanskip<<6)|hopping_frequency_no; - packet[5] = chanskip>>2; - packet[6] = RX_num; - //packet[7] = FLAGS 00 - standard packet - //10, 12, 14, 16, 18, 1A, 1C, 1E - failsafe packet - //20 - range check packet - packet[7] = 0; - packet[8] = 0; - // - if ( lpass & 1 ) - startChan += 8 ; - - for(uint8_t i = 0; i <12 ; i+=3) - {//12 bytes - chan_0 = scaleForPXX(startChan); - if(lpass & 1 ) - chan_0+=2048; - startChan+=1; - // - chan_1 = scaleForPXX(startChan); - if(lpass & 1 ) - chan_1+= 2048; - startChan+=1; - // - packet[9+i] = lowByte(chan_0);//3 bytes*4 - packet[9+i+1]=(((chan_0>>8) & 0x0F)|(chan_1 << 4)); - packet[9+i+2]=chan_1>>4; - } - - packet[21] = seq_last_sent << 4 | seq_last_rcvd;//8 at start - if (seq_last_sent < 0x08 && seq_last_rcvd < 8) - seq_last_sent = (seq_last_sent + 1) % 4; - else if (seq_last_rcvd == 0x00) - seq_last_sent = 1; - else - seq_last_rcvd = 8; - - if(sub_protocol & 1 )// in X8 mode send only 8ch every 9ms - lpass = 0 ; - else - lpass += 1 ; - - uint8_t limit = (sub_protocol & 2 ) ? 31 : 28 ; - for (uint8_t i=22;i>8;//high byte - packet[limit]=lcrc;//low byte -} - -uint16_t ReadFrSkyX() -{ - switch(state) - { - default: - set_start(47); - CC2500_SetPower(); - CC2500_Strobe(CC2500_SFRX); - // - frskyX_build_bind_packet(); - CC2500_Strobe(CC2500_SIDLE); - CC2500_WriteData(packet, packet[0]+1); - if(IS_BIND_DONE_on) - state = FRSKY_BIND_DONE; - else - state++; - return 9000; - case FRSKY_BIND_DONE: - initialize_data(0); - hopping_frequency_no=0; - BIND_DONE; - state++; - break; - case FRSKY_DATA1: - if ( prev_option != option ) - { - CC2500_WriteReg(CC2500_0C_FSCTRL0,option); // Frequency offset hack - prev_option = option ; - } - CC2500_SetTxRxMode(TX_EN); - set_start(hopping_frequency_no); - CC2500_SetPower(); - CC2500_Strobe(CC2500_SFRX); - hopping_frequency_no = (hopping_frequency_no+chanskip)%47; - CC2500_Strobe(CC2500_SIDLE); - CC2500_WriteData(packet, packet[0]+1); - // - frskyX_data_frame(); - state++; - return 5500; - case FRSKY_DATA2: - CC2500_SetTxRxMode(RX_EN); - CC2500_Strobe(CC2500_SIDLE); - state++; - return 200; - case FRSKY_DATA3: - CC2500_Strobe(CC2500_SRX); - state++; - return 3000; - case FRSKY_DATA4: - len = CC2500_ReadReg(CC2500_3B_RXBYTES | CC2500_READ_BURST) & 0x7F; - if (len && (len<=(0x0E + 3))) //Telemetry frame is 17 - { - packet_count=0; - CC2500_ReadData(pkt, len); - #if defined TELEMETRY - frsky_check_telemetry(pkt,len); //check if valid telemetry packets - //parse telemetry packets here - //The same telemetry function used by FrSky(D8). - #endif - } - else - { - packet_count++; - // restart sequence on missed packet - might need count or timeout instead of one missed - if(packet_count>100) - {//~1sec - seq_last_sent = 0; - seq_last_rcvd = 8; - packet_count=0; - #if defined TELEMETRY - telemetry_lost=1; - #endif - } - CC2500_Strobe(CC2500_SFRX); //flush the RXFIFO - } - state = FRSKY_DATA1; - return 300; - } - return 1; -} - -uint16_t initFrSkyX() -{ - set_rx_tx_addr(MProtocol_id_master); - Frsky_init_hop(); - packet_count=0; - while(!chanskip) - chanskip=random(0xfefefefe)%47; - - //for test*************** - //rx_tx_addr[3]=0xB3; - //rx_tx_addr[2]=0xFD; - //************************ - frskyX_init(); - // - if(IS_AUTOBIND_FLAG_on) - { - state = FRSKY_BIND; - initialize_data(1); - } - else - { - state = FRSKY_DATA1; - initialize_data(0); - } - seq_last_sent = 0; - seq_last_rcvd = 8; - return 10000; -} -#endif \ No newline at end of file From 235876a4d8c3e9b1034acad6d023d1d95ac3b30a Mon Sep 17 00:00:00 2001 From: pascallanger Date: Mon, 20 Nov 2017 15:58:06 +0100 Subject: [PATCH 093/121] Delete Models.md --- docs/Models.md | 189 ------------------------------------------------- 1 file changed, 189 deletions(-) delete mode 100644 docs/Models.md diff --git a/docs/Models.md b/docs/Models.md deleted file mode 100644 index a9d8293..0000000 --- a/docs/Models.md +++ /dev/null @@ -1,189 +0,0 @@ -# Model Setup -This is the page to document model or receiver specific setup instructions. - -The Deviation project (on which this project was based) have a useful list of models [here](http://www.deviationtx.com/wiki/supported_models). - -# Syma X5C - - -## Channel Map -CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 ----|---|---|---|---|---|---|--- -A|E|T|R|FLIP|RATES|PICTURE|VIDEO - -## Binding -There are no special binding instructions. The model powers up in Autobind mode and expects the bind sequence from the transmitter within the first 4-5 seconds. - -## Tx Setup -A basic 4-channel setup works perfectly, but some improvements are possible: - -### Setting up a switch to Flip - -1. Choose your "Rates" switch - typically the momentary TRN switch -1. In the Mixer create an entry for CH5 -1. Edit this line as follows: - - er9X: Source: sTRN, Weight 100 (or whatever switch you selected) - - OpenTx: Source: SH, Weight 200 (or whatever switch you selected) - -### Setting up a swich for high rates - -1. Choose your "Rates" switch -1. In the Mixer create an entry for CH6 -1. Edit this line as follows: - - er9X: Source: sTHR, Weight 100 (or whatever switch you selected) - - OpenTx: Source: SF, Weight 200 (or whatever switch you selected) - -When the switch is in the rear position the rates will be standard, when the switch is forward rates will be high. There is no need to move the throttle stick to the full up and full down position as with the standard controller. - -### Setting up Idle-up -One of the most annoying functions on the Syma X5C is that the motors stop when the throttle is pulled back. This can be fixed by implmenting Idle-up on the transmitter (think of this as a very simple version of the Betaflight "Air Mode"). Idle up will ensure that even when the throttle is all the way down, a minimum command is passed to the motor to keep them spinning and to activate the stabilization. - -**To do this**: - -1. Decide on a switch you will use to activate Idle up -1. In the mixer menu add a line under Throttle and mix in a value of between 4 and 6 to be added to the throttle value if the switch is activated. What this does is effectively prevents the throttle from going down to less than this value. -1. When you want to fly in "idle-up" mode flick the switch and your stabilization will always be active. -1. Remeber to switch off idle-up as soon as the quad lands (or crashes - to avoid damage to the motors) - -# Inductrix (Horizon Hobby) - - - -## Binding -For telemetry enabled modules, you should just let the remote autodetect the settings. Otherwise choose DSMX 22ms with 6ch or 7ch. To bind the model, keep the transmitter off, power on the Inductrix. Wait until it flashes fast and then power up the Tx and use Bind. - -### Throttle -For Inductrix FPV you might need to adjust the lower end of throttle to be a higher than default, otherwise motors will be spinning on minimal throttle. One way to do this is to set the throttle to 80% output (100% of DSM output) and then to enable the **Throttle Idle Trim Only** under the Model Setup menu. See image below: - - - -### Acro and Level Mode -Setup channel 6 with a momemtary button or switch (e.g. SH on the Taranis) and use that switch to switch between modes. Set the output to somewhere between 40% to 60% for best results. - -An addition consideration when flying in Acro mode is to reduce stick sensitivity and to add some expo. The screens below show one way of doing this. Customize to your needs. - -#### Inputs Screen -The follwing INPUTS screen shows one potential setup to introduce expo for Acro mode. The activation of the expo on Roll, Pitch and Yaw is when the SG switch is not in the back position. Add to taste. - - - -#### Aileron Rates attached to Switch !SG-up -The next screen shows and example of how the expo (50%) was set up on the stick input and how it is activated by !SG-up: - - - -#### Mixer Menu -The next screen shows the mixer menu with the mode change on momentary switch SH and High-Low rates on switch SC: - - - -# Cheerson CX-20 / Quanum Nova - - -## Channel Map - -CH1|CH2|CH3|CH4|CH5|CH6|CH7 ----|---|---|---|---|---|--- -A|E|T|R|MODE|AUX1|AUX2 - -## Binding -The Rx powers up in binding mode so the transmitter should be set to autobind. If the Tx signal is lost due to power-off or going out of range the Rx will not re-bind, and requires power-cycling before it will bind again. - -## Tx Setup -AETR are simple +100% mixes. Note that the model expects Elevator (CH2) to be reversed, which is handled in the module firmware, so no need to reverse it on the Tx. - -### Flight modes -CH5 is used to transmit the flight mode to the APM flight controller by setting the output to a value in a pre-defined range. The original Tx uses a 3-pos switch (SWA) and a 2-pos switch (SWB) to achieve six different combinations, but only five are used - with SWA at 0, 1500 is sent when SWB is at 0 and 1, leaving flight mode 3 unused. However, in the stock CX-20 flight controller settings, both flight mode 3 and 4 are set to the same flight mode, meaning we can configure our new Tx settings to send a value for mode 3 without changing the standard flight mode behaviour. Afterwards, you can optionally use Mission Planner to assign a new flight mode to mode 3 or mode 4, or reconfigure them altogether. - -The values, modes, and switch positions for the stock Tx are: - -Mode|Stock Tx PWM Value|CX-20 Mode|SWA|SWB ----|---|---|---|--- -1|1100|Return to Home|2|0 -2|1300|Altitude Sensor|2|1 -3|||| -4|1500|Manual|0|0 or 1 -5|1700|Direction Lock|1|1 -6|1900|Stable|1|0 - -**NB** The CX-20 uses flight mode names which are different to the standard APM flight mode names. The CX-20 modes map to APM modes as follows: - -CX-20 Mode|APM Mode ----|--- -Manual|Stabilize -Stable|Loiter -Direction Locked|Simple -Altitude Sensor|Altitude Hold -Return to Home|RTL (Return to Launch) - -We need to set the Tx up to output these values on CH5 (or very similar values - more information, including the PWM width ranges is documented in the [Arducopter Wiki](http://ardupilot.org/copter/docs/common-rc-transmitter-flight-mode-configuration.html#common-rc-transmitter-flight-mode-configuration)). - -One easy way to acheive this is to configure six logical switches mapped to two physical switches, for example the 3-way ID switch and the AIL D/R switch, then configure the logical switches to activate a flgiht mode and to apply a specific weight to the CH5 output. - -To simply map the old Tx modes to the new Tx using the same switch positions, use the following configuration. The stock SWA switch is replaced with the ID0/1/2 switch, SWB is replaced with the AIL D/R switch. - -#### Logical switches: - -Switch|Function|V1|V2 ----|---|---|--- -L. Switch 1|AND|ID2|!AIL -L. Switch 2|AND|ID2|AIL -L. Switch 3|AND|ID0|!AIL -L. Switch 4|AND|ID0|AIL -L. Switch 5|AND|ID1|AIL -L. Switch 6|AND|ID1|!AIL - -#### light modes (using CX-20 names): - -Mode|Name|Switch ----|---|--- -1|RTL|L1 -2|AltSen|L2 -3|Manual|L3 -4|Manual|L4 -5|DirLock|L5 -6|Stable|L6 - -#### Mixer setup: - -Channel|Weight|Source|Switch|Multiplex ----|---|---|---|--- -CH5|-80%|HALF|L1|REPLACE - |-40%|HALF|L2|REPLACE - |-20%|HALF|L3|REPLACE - |+0%|HALF|L4|REPLACE - |+40%|HALF|L5|REPLACE - |+80%|HALF|L6|REPLACE - -**NB** The weight values in this table will get you in the ball park, and will most likely work fine. Because transmitters can vary they should be double-checked in the Mission Planer Radio Calibration screen, and tweaked as necessary. - -### CH6 and CH7 -CH6 and CH7 can be assigned to switches or pots to provide additionaly functionality such as PID tuning, gimbal control, or APM auto-tune or auto-land. - -Replicating the stock setup of two pots, you would assign: - -Channel|Weight|Source|Multiplex ----|---|---|--- -CH6|+100%|P1|ADD -CH7|+100%|P3|ADD - -## Full Mixer Setup - -Channel|Source|Weight|Switch|Multiplex ----|---|---|---|--- -CH1|+100%|Aileron|| -CH2|+100%|Elevator|| -CH3|+100%|Throttle|| -CH4|+100%|Rudder|| -CH5|-80%|HALF|L1|REPLACE - |-40%|HALF|L2|REPLACE - |-20%|HALF|L3|REPLACE - |+0%|HALF|L4|REPLACE - |+40%|HALF|L5|REPLACE - |+80%|HALF|L6|REPLACE -CH6|+100%|P1| -CH7|+100%|P3| - -Once you have configured the mixes you should connect Mission Planner to your CX-20 and use the Radio Calibration screen to verify that the channels are correctly assigned, and that the flight modes are correct. Mission planner will give the exact PWM value on CH5, allowing the weights to be adjusted if needed. - - From 47207dceadceaa8ba3f74f877848bb92c94c01ad Mon Sep 17 00:00:00 2001 From: pascallanger Date: Mon, 20 Nov 2017 15:58:19 +0100 Subject: [PATCH 094/121] Delete Compiling_STM32.md --- docs/Compiling_STM32.md | 117 ---------------------------------------- 1 file changed, 117 deletions(-) delete mode 100644 docs/Compiling_STM32.md diff --git a/docs/Compiling_STM32.md b/docs/Compiling_STM32.md deleted file mode 100644 index e1536d4..0000000 --- a/docs/Compiling_STM32.md +++ /dev/null @@ -1,117 +0,0 @@ -# Compliling and Programming (STM32) - -**If you are Compling for the Arduino ATmega328p version of the Multiprotocol Module please go to the dedicated [Compiling and Programming ATmega328](Compiling.md) page.** - -## IMPORTANT NOTE: -Multiprotocol source can be compiled using the Arduino IDE using STM32 Core (Maple) and Arduino ARM-Cortex-M3 libraries. -On all modules with STM32F103 microcontroller, the program flash memory on the microcontroller is large enough to accommodate all the protocols. You do not have to make choices on which protocols to upload. Also, it is likely that you used the Banggood 4-in-1 RF module and you will therefore have access to all the RF modules.Now for programmng multimodule with STM32 chip you have 2 options presented below. - -1. Compiling and flashing in Arduino IDE. -1. Flashing precompiled binaries from [here](https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/releases) - - If using one of these TX with multimodule like Turnigy 9X,9XR,9X+ the binary file for flashing is **Multiprotocol_V1.X.X_STM32.bin**. - - If using TARANIS TX the binary file is **Multiprotocol_V1.X.X_STM32_INV.bin** - -Flashing precompiled **binaries** is done very simple with the cable setup presented below and an utility(GUI) **ST Flash Loader Demonstrator.** - -## Compiling source and flashing in Arduino. - -### Install the Arduino IDE and the Multiprotocol project -1. Download the Arduino IDE. The currently supported Arduino version is 1.6.11 available for [Windows]( https://www.arduino.cc/download_handler.php?f=/arduino-1.6.12-windows.exe) and [Mac OSX](http://arduino.cc/download_handler.php?f=/arduino-1.6.12-macosx.zip) -1. It is recommended to upgrade Java to the [latest version](https://www.java.com/en/download/) -1. Download the [STM32 Core](https://github.com/rogerclarkmelbourne/Arduino_STM32/archive/master.zip) and copy the Arduino_STM32 folder to: - - OSX: ```Arduino.app/Contents/Java/hardware``` (you can open Arduino.app by Ctl Clicking on Arduino.app and selecting "Show Package Contents") - - Windows: ```C:\Program Files (x86)\Arduino\hardware``` - - Make sure the folder tree structure is like this .....\hardware\Arduino_STM32\.....and **NOT** ...... \hardware\Arduino_STM32-master\Arduino_STM32-master\......So move the folders /rename accordingly. -1. Download the zip file with the Multiprotocol module source code from [here](https://github.com/pascallanger/DIY-Multiprotocol-TX-Module) -1. Unzip and copy the source code folder ```Multiprotocol``` to a folder of your choosing -1. Click on the ```Multiprotocol.ino file``` in the ```Multiprotocol``` folder and the Arduino environment should appear and the Multiprotocol project will be loaded. - -### Prepare the Arduino IDE: - -1. In order to compile successfully you need also to modify a maple library file. In ```....\hardware\Arduino_STM32\STM32F1\cores\maple\libmaple\usart_f1.c``` comment out the 2 functions as shown below. This is required to have low-level access to the USART interrupt.
- ``` - /* void __irq_usart2(void){ - usart_irq(&usart2_rb, USART2_BASE); - } - - void __irq_usart3(void) { - usart_irq(&usart3_rb, USART3_BASE); - } */ - ``` -1. Run the IDE, and on the **Tools** menu, select **Board** and then **Boards manager**.
Click on the Arduino DUE (32 Bits ARM-Cortex M3) from the list of available boards. You must do this step, it installs the arm-none-eabi-g++ toolchain! -1. Close and reopen the Arduino IDE and load the Multiprotocol project. -1. In arduino IDE under the **Tools** -> **Board:** select the **Generic STM32F103C series** board -1. Click on the **Verify** button to test compile the before you make any changes.
If there are any errors check the process above and be sure to have the right version of the Arduino IDE.The binary file generated location is presented at the bottom of Arduino IDE compiling window.Now continue with flashing procedure. - - -### Flashing the multimodule - -There are three options for flashing the firmware. But We will present here only 2 methods ,the third one is presented in advanced topics. -The first (and strongly recommended) is flashing it while it is plugged into and powered by the transmitter.The second is preparing the board for flashing with a USB cable. -The second method is definitely the easiest in the long-term, but it does require the USB bord and setting up the bootloader on the STM32 MCU. - -#### Option 1: Flashing with Tx power(highly recommended) - -1. Put the module in the Tx -1. Place a jumper over the BOOT0 pins.Skip this one if you made your own cable for flashing ,see below. -1. Connect your 3.3V/5V FTDI cable (USB - TTL serial) to Multiprotocol serial port.
Connect only RX, TX and GND. **Do not connect the 5V or 3.3V between the FTDI cable and the module - the power will be supplied by the transmitter**. Connect the pins as follows: - - Module RX pin to FTDI TX pin - - Module TX pin to FTDI Rx pin - - Module GND to FTDI GND -1. In arduino IDE under the **Tools** -> **Board:** check that you have selected the **Generic STM32F103C series** board -1. Under **Tools** -> **Upload Method:** select **Serial** -1. Click "Upload" and the sketch will be uploaded normally. This is valid for all arduino versions. -1. Once the firmware has uploaded, remove the BOOT0 jumper. - -If you have the module inside a box and to be inserted in TX bay, you may build a flashing cable like in the picture below. -You can attach and solder a 5 pin header female and top outside the box.**ALways insert first the USB serial device in USB port , and TX start after.** - - - -See below my module for reference - - - -#### Option 2: Flashing with USB cable. - -This method use USB connector on the STM32 V1.0 board or on the maple clone board. -1. Install first maple USB driver by running the batch file found in Arduino STM32 package folder ```..\hardware\Arduino_STM32\drivers\win\install_drivers.bat``` -1. Download the free STM32 flash loader demonstrator from [ST.com](http://www.st.com/en/development-tools/flasher-stm32.html) and using a USB-TTL device (like FTDI cable) flash the STM32duino bootloader available from Roger Clark's great STM32 site [here](https://github.com/rogerclarkmelbourne/STM32duino-bootloader/tree/master/STM32F1/binaries) .Use bootloader **generic_boot20_pa1.bin** -1. Open Arduino IDE,browse to multiprotocol folder,load the sketch multiprotocol.ino.Select the serial COM port(see notes below) -1. In Arduino IDE under "Upload method" select **STM32duino**-bootloader.Click upload ,wait until upload is complete. - -Notes: -- When you use multiSTM32_USB for the first time,the USB drivers are not recognized and com port is not open/recognized(arduino IDE port selection is grey/unavailable). After this first time use, any subsequent update of the program, you'll have to select the correct serial port and upload sketches normally in Arduino using USB port. -- More explanations how all these work you find [here](http://www.stm32duino.com/viewtopic.php?f=32&t=1774_) -- If the initial upload fails, make sure you are running the latest [Java version](https://www.java.com/en/download/) -- If using Banggood multiSTM32_USB module, follow instructions from step1(USB drivers on your computer) and jump after, to step 3(most probably generic bootloader is installed on multi module and no need to be installed again).I don't have one for test so this is an educated guess. - -## Flashing precompiled binaries: - -If you want to flash a pre-compiled binary file (like the Release .bin files) you need specialized software and the same FTDI cable setup already posted [here](Compiling_STM32.md#option-1-flashing-with-tx-powerhighly-recommended). - -1. Set BOOT0 jumper(skip this step if you aready made your own cable ,see above) -1. Connect your 3.3V FTDI cable (USB - TTL serial) to Multiprotocol serial port (RX,TX,GND pins when flashing with TX power). -1. Insert first FTDI serial to USB port.Start TX (only if using flashing with TX power method) -1. The other steps regarding power supply the same as previous recommandation regarding jumpers - -For uploading binaries(.bin files) there is a specialized software you need to install on your computer. - -#### Windows: -Download the **ST Flash Loader Demonstrator** from here: http://www.st.com/content/st_com/en/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-programmers/flasher-stm32.html - -Run the ST Flash Loader program. There are many tutorials on the web on how to use this program.For example: [here](http://www.scienceprog.com/flashing-programs-to-stm32-embedded-bootloader) - -#### OSX: -To be checked. - -### Report issues for the STM32 board -You can report your problem using the [GitHub issue](https://github.com/midelic/DIY-Multiprotocol-TX-Module/issues) system or go to the [Main thread on RCGROUPS](http://www.rcgroups.com/forums/showthread.php?t=2165676) to ask your question. -Please provide the following information: - -- Multiprotocol code version -- STM32 version -- TX type -- Using PPM or Serial, if using er9x or ersky9x the version in use -- Different led status (multimodule and model) -- Explanation of the behavior and reproduction steps From 8ea70a1b771928410161da0b4360860b42b2f69d Mon Sep 17 00:00:00 2001 From: Pascal Langer Date: Mon, 20 Nov 2017 16:01:12 +0100 Subject: [PATCH 095/121] Tons of updates --- Boards/package_MULTI2_index.json | 99 -- Boards/package_MULTI_index.json | 99 -- .../AtmegaEmptyBoot/AtmegaMultiEmpty.hex | 2 + .../AtmegaMultiBoot/AtmegaMultiBoot.hex | 34 + BootLoaders/AtmegaMultiBoot/Source/Makefile | 504 +++++++++ BootLoaders/AtmegaMultiBoot/Source/boot.h | 848 +++++++++++++++ BootLoaders/AtmegaMultiBoot/Source/optiboot.c | 891 ++++++++++++++++ BootLoaders/AtmegaMultiBoot/Source/pin_defs.h | 80 ++ BootLoaders/AtmegaMultiBoot/Source/stk500.h | 39 + BootLoaders/Boards/boards.txt | 41 + .../bootloaders/Multi4in1/AtmegaMultiBoot.hex | 34 + .../Multi4in1/AtmegaMultiEmpty.hex | 2 + BootLoaders/Boards/platform.local.txt | 1 + BootLoaders/Boards/platform.txt | 9 + .../OrangeMultiBoot/OrangeMultiBoot.hex | 47 + BootLoaders/OrangeMultiBoot/Source/Makefile | 503 +++++++++ BootLoaders/OrangeMultiBoot/Source/optiboot.c | 980 ++++++++++++++++++ BootLoaders/OrangeMultiBoot/Source/pin_defs.h | 80 ++ BootLoaders/OrangeMultiBoot/Source/stk500.h | 39 + BootLoaders/README.md | 32 + BootLoaders/StmMultiBoot/README.md | 1 + BootLoaders/StmMultiBoot/StmMultiBoot.bin | Bin 0 -> 7788 bytes .../package_multi_4in1_board_index.json | 33 + .../package_multi_4in1_board_v1.0.0.zip | Bin 0 -> 2479 bytes Multiprotocol/AFHDS2A_a7105.ino | 22 +- Multiprotocol/Bayang_nrf24l01.ino | 107 +- Multiprotocol/FrSkyX_cc2500.ino | 302 ++++++ Multiprotocol/Multi.txt | 2 +- Multiprotocol/Multiprotocol.h | 10 +- Multiprotocol/Multiprotocol.ino | 192 +++- Multiprotocol/Symax_nrf24l01.ino | 36 +- Multiprotocol/Telemetry.ino | 286 ++++- Multiprotocol/_Config.h | 46 +- Protocols_Details.md | 13 +- docs/Compiling_STM32.md | 137 +++ docs/Models.md | 226 ++++ 36 files changed, 5485 insertions(+), 292 deletions(-) delete mode 100644 Boards/package_MULTI2_index.json delete mode 100644 Boards/package_MULTI_index.json create mode 100644 BootLoaders/AtmegaEmptyBoot/AtmegaMultiEmpty.hex create mode 100644 BootLoaders/AtmegaMultiBoot/AtmegaMultiBoot.hex create mode 100644 BootLoaders/AtmegaMultiBoot/Source/Makefile create mode 100644 BootLoaders/AtmegaMultiBoot/Source/boot.h create mode 100644 BootLoaders/AtmegaMultiBoot/Source/optiboot.c create mode 100644 BootLoaders/AtmegaMultiBoot/Source/pin_defs.h create mode 100644 BootLoaders/AtmegaMultiBoot/Source/stk500.h create mode 100644 BootLoaders/Boards/boards.txt create mode 100644 BootLoaders/Boards/bootloaders/Multi4in1/AtmegaMultiBoot.hex create mode 100644 BootLoaders/Boards/bootloaders/Multi4in1/AtmegaMultiEmpty.hex create mode 100644 BootLoaders/Boards/platform.local.txt create mode 100644 BootLoaders/Boards/platform.txt create mode 100644 BootLoaders/OrangeMultiBoot/OrangeMultiBoot.hex create mode 100644 BootLoaders/OrangeMultiBoot/Source/Makefile create mode 100644 BootLoaders/OrangeMultiBoot/Source/optiboot.c create mode 100644 BootLoaders/OrangeMultiBoot/Source/pin_defs.h create mode 100644 BootLoaders/OrangeMultiBoot/Source/stk500.h create mode 100644 BootLoaders/README.md create mode 100644 BootLoaders/StmMultiBoot/README.md create mode 100644 BootLoaders/StmMultiBoot/StmMultiBoot.bin create mode 100644 BootLoaders/package_multi_4in1_board_index.json create mode 100644 BootLoaders/package_multi_4in1_board_v1.0.0.zip create mode 100644 Multiprotocol/FrSkyX_cc2500.ino create mode 100644 docs/Compiling_STM32.md create mode 100644 docs/Models.md diff --git a/Boards/package_MULTI2_index.json b/Boards/package_MULTI2_index.json deleted file mode 100644 index 00c7d96..0000000 --- a/Boards/package_MULTI2_index.json +++ /dev/null @@ -1,99 +0,0 @@ -{ - "packages": [ - { - "name": "MULTI", - "maintainer": "Pascal", - "help": { - "online": "https://www.rcgroups.com/forums/showthread.php?2165676-DIY-Multiprotocol-TX-Module/page555" - }, - "websiteURL": "https://github.com/pascallanger/DIY-Multiprotocol-TX-Module", - "platforms": [ - { - "name": "Multi 4in1 Atmega328p", - "architecture": "avr", - "version": "1.0.0", - "category": "Multi", - "help": { - "online": "https://www.rcgroups.com/forums/showthread.php?2165676-DIY-Multiprotocol-TX-Module/page555" - }, - "url": "https://github.com/pascallanger/DIY-Multiprotocol-TX-Module", - "archiveFileName": "multi_avr-1.0.0.zip", - "checksum": "SHA-256:ec3ff8a1dc96d3ba6f432b9b837a35fd4174a34b3d2927de1d51010e8b94f9f1", - "size": "15005", - "boards": [ - {"name": "Multi 4in1 Atmega328p"}, - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "avr-gcc", - "version": "4.8.1-arduino5" - }, - { - "packager": "arduino", - "name": "avrdude", - "version": "6.0.1-arduino5" - } - ] - }, - { - "name": "Multi 4in1 STM32", - "architecture": "stm32", - "version": "1.0.0", - "category": "Multi", - "help": { - "online": "https://www.rcgroups.com/forums/showthread.php?2165676-DIY-Multiprotocol-TX-Module/page555" - }, - "url": "https://github.com/pascallanger/DIY-Multiprotocol-TX-Module", - "archiveFileName": "multi_stm32-1.0.0.zip", - "checksum": "SHA-256:ec3ff8a1dc96d3ba6f432b9b837a35fd4174a34b3d2927de1d51010e8b94f9f1", - "size": "15005", - "boards": [ - {"name": "Multi 4in1 STM32"}, - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "avr-gcc", - "version": "4.8.1-arduino5" - }, - { - "packager": "arduino", - "name": "avrdude", - "version": "6.0.1-arduino5" - } - ] - }, - { - "name": "Multi 4in1 OrangeTX", - "architecture": "xmega", - "version": "1.0.0", - "category": "Multi", - "help": { - "online": "https://www.rcgroups.com/forums/showthread.php?2165676-DIY-Multiprotocol-TX-Module/page555" - }, - "url": "https://github.com/pascallanger/DIY-Multiprotocol-TX-Module", - "archiveFileName": "multi_xmega-1.0.0.zip", - "checksum": "SHA-256:ec3ff8a1dc96d3ba6f432b9b837a35fd4174a34b3d2927de1d51010e8b94f9f1", - "size": "15005", - "boards": [ - {"name": "Multi 4in1 OrangeTX"}, - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "avr-gcc", - "version": "4.8.1-arduino5" - }, - { - "packager": "arduino", - "name": "avrdude", - "version": "6.0.1-arduino5" - } - ] - } - ], - "tools":[] - } - ] -} diff --git a/Boards/package_MULTI_index.json b/Boards/package_MULTI_index.json deleted file mode 100644 index 5bef129..0000000 --- a/Boards/package_MULTI_index.json +++ /dev/null @@ -1,99 +0,0 @@ -{ - "packages": [ - { - "name": "MULTI", - "maintainer": "Pascal", - "help": { - "online": "https://www.rcgroups.com/forums/showthread.php?2165676-DIY-Multiprotocol-TX-Module/page555" - }, - "websiteURL": "https://github.com/pascallanger/DIY-Multiprotocol-TX-Module", - "platforms": [ - { - "name": "Multi 4in1 Atmega328p", - "architecture": "avr", - "version": "1.0.0", - "category": "Multi", - "help": { - "online": "https://www.rcgroups.com/forums/showthread.php?2165676-DIY-Multiprotocol-TX-Module/page555" - }, - "url": "https://github.com/pascallanger/DIY-Multiprotocol-TX-Module", - "archiveFileName": "multi_avr-1.0.0.zip", - "checksum": "SHA-256:ec3ff8a1dc96d3ba6f432b9b837a35fd4174a34b3d2927de1d51010e8b94f9f1", - "size": "15005", - "boards": [ - {"name": "Multi 4in1 Atmega328p"} - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "avr-gcc", - "version": "4.8.1-arduino5" - }, - { - "packager": "arduino", - "name": "avrdude", - "version": "6.0.1-arduino5" - } - ] - }, - { - "name": "Multi 4in1 STM32", - "architecture": "stm32", - "version": "1.0.0", - "category": "Multi", - "help": { - "online": "https://www.rcgroups.com/forums/showthread.php?2165676-DIY-Multiprotocol-TX-Module/page555" - }, - "url": "https://github.com/pascallanger/DIY-Multiprotocol-TX-Module", - "archiveFileName": "multi_stm32-1.0.0.zip", - "checksum": "SHA-256:ec3ff8a1dc96d3ba6f432b9b837a35fd4174a34b3d2927de1d51010e8b94f9f1", - "size": "15005", - "boards": [ - {"name": "Multi 4in1 STM32"} - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "avr-gcc", - "version": "4.8.1-arduino5" - }, - { - "packager": "arduino", - "name": "avrdude", - "version": "6.0.1-arduino5" - } - ] - }, - { - "name": "Multi 4in1 OrangeTX", - "architecture": "xmega", - "version": "1.0.0", - "category": "Multi", - "help": { - "online": "https://www.rcgroups.com/forums/showthread.php?2165676-DIY-Multiprotocol-TX-Module/page555" - }, - "url": "https://github.com/pascallanger/DIY-Multiprotocol-TX-Module", - "archiveFileName": "multi_xmega-1.0.0.zip", - "checksum": "SHA-256:ec3ff8a1dc96d3ba6f432b9b837a35fd4174a34b3d2927de1d51010e8b94f9f1", - "size": "15005", - "boards": [ - {"name": "Multi 4in1 OrangeTX"} - ], - "toolsDependencies": [ - { - "packager": "arduino", - "name": "avr-gcc", - "version": "4.8.1-arduino5" - }, - { - "packager": "arduino", - "name": "avrdude", - "version": "6.0.1-arduino5" - } - ] - } - ], - "tools":[] - } - ] -} diff --git a/BootLoaders/AtmegaEmptyBoot/AtmegaMultiEmpty.hex b/BootLoaders/AtmegaEmptyBoot/AtmegaMultiEmpty.hex new file mode 100644 index 0000000..23e6738 --- /dev/null +++ b/BootLoaders/AtmegaEmptyBoot/AtmegaMultiEmpty.hex @@ -0,0 +1,2 @@ +:02000000FFFF00 +:00000001FF diff --git a/BootLoaders/AtmegaMultiBoot/AtmegaMultiBoot.hex b/BootLoaders/AtmegaMultiBoot/AtmegaMultiBoot.hex new file mode 100644 index 0000000..b21d654 --- /dev/null +++ b/BootLoaders/AtmegaMultiBoot/AtmegaMultiBoot.hex @@ -0,0 +1,34 @@ +:107E0000112484B714BE9FEF9BB99CE395B991E010 +:107E100098B98370A9F08AEF80938500109284004E +:107E200085E08093810096BBB09BFECF10928100CD +:107E300093B186B181709C73892B8D3109F0B3D0D9 +:107E400082E08093C00088E18093C10086E0809347 +:107E5000C20081E28093C400259AC0E0D0E093E0A4 +:107E6000F92EEE24E39425E0D22E31E1C32EA9D0E1 +:107E7000813481F4A6D08EBBABD08EB3823811F49E +:107E800085E006C08EB3813811F484E001C083E040 +:107E900091D086C0823411F484E103C0853419F492 +:107EA00085E09DD07DC0853541F48BD0C82F89D029 +:107EB000D0E0D82BCC0FDD1F72C0863521F484E0D2 +:107EC0008ED080E0E5CF843609F03DC07AD079D0FD +:107ED000B82E77D0C11520E7D20718F000E011E0E6 +:107EE00004C0FE01F7BEE895F9CF6BD0F80181938D +:107EF0008F01BE12FACFCE01905781159E4018F423 +:107F0000FE01F7BEE89564D0C115FEE7DF0708F073 +:107F100047C007B600FCFDCFFE01A0E0B1E08D91A7 +:107F20009D910C01E7BEE89511243296A03821E01E +:107F3000B207A9F7FE01D7BEE89507B600FCFDCF52 +:107F4000C7BEE8952DC08437B1F43BD03AD0B82EE7 +:107F500038D03ED0FE01AC2EAB0C8F010F5F1F4F0F +:107F6000849128D0A01205C02196BA94CB0DD11DC2 +:107F700017C0F801F2CF853739F42AD08EE11AD034 +:107F800085E918D08FE084CF813549F421D080E194 +:107F900011D08091C00086FFFCCF05D001C018D061 +:107FA00080E108D064CFE0E0F0E084918F3F09F0F9 +:107FB000099408959091C00095FFFCCF8093C6006E +:107FC00008958091C00087FFFCCF8091C60008957E +:107FD000F8DF803211F085E1EDDF84E1EBCFCF9364 +:107FE000C82FEFDFC150E9F7CF91F2CFA8950895E0 +:0C7FF000E0E6F0E098E1908380830895C3 +:0400000300007E007B +:00000001FF diff --git a/BootLoaders/AtmegaMultiBoot/Source/Makefile b/BootLoaders/AtmegaMultiBoot/Source/Makefile new file mode 100644 index 0000000..de8bb0b --- /dev/null +++ b/BootLoaders/AtmegaMultiBoot/Source/Makefile @@ -0,0 +1,504 @@ +# Makefile for ATmegaBOOT +# E.Lins, 18.7.2005 +# $Id$ +# +# Instructions +# +# To make bootloader .hex file: +# make diecimila +# make lilypad +# make ng +# etc... +# +# To burn bootloader .hex file: +# make diecimila_isp +# make lilypad_isp +# make ng_isp +# etc... + +# program name should not be changed... +PROGRAM = optiboot + +# The default behavior is to build using tools that are in the users +# current path variables, but we can also build using an installed +# Arduino user IDE setup, or the Arduino source tree. +# Uncomment this next lines to build within the arduino environment, +# using the arduino-included avrgcc toolset (mac and pc) +# ENV ?= arduino +# ENV ?= arduinodev +# OS ?= macosx +# OS ?= windows + + +# enter the parameters for the avrdude isp tool -b19200 +# +# These are the parameters for a usb-based STK500v2 programmer. +# Exact type unknown. (historical Makefile values.) +ISPTOOL = stk500v2 +ISPPORT = usb +ISPSPEED = -b 57600 +# +# +# These are parameters for using an Arduino with the ArduinoISP sketch +# as the programmer. On a mac, for a particular Uno as programmer. +#ISPTOOL = stk500v1 -C /Applications/arduino/arduino-0022/hardware/tools/avr/etc/avrdude.conf +#ISPPORT = /dev/tty.usbmodemfd3141 +#ISPSPEED = -b19200 + +MCU_TARGET = atmega168 +LDSECTIONS = -Wl,--section-start=.text=0x3e00 -Wl,--section-start=.version=0x3ffe + +# Build environments +# Start of some ugly makefile-isms to allow optiboot to be built +# in several different environments. See the README.TXT file for +# details. + +# default +fixpath = $(1) + +ifeq ($(ENV), arduino) +# For Arduino, we assume that we're connected to the optiboot directory +# included with the arduino distribution, which means that the full set +# of avr-tools are "right up there" in standard places. +TOOLROOT = ../../../tools +GCCROOT = $(TOOLROOT)/avr/bin/ +AVRDUDE_CONF = -C$(TOOLROOT)/avr/etc/avrdude.conf + +ifeq ($(OS), windows) +# On windows, SOME of the tool paths will need to have backslashes instead +# of forward slashes (because they use windows cmd.exe for execution instead +# of a unix/mingw shell?) We also have to ensure that a consistent shell +# is used even if a unix shell is installed (ie as part of WINAVR) +fixpath = $(subst /,\,$1) +SHELL = cmd.exe +endif + +else ifeq ($(ENV), arduinodev) +# Arduino IDE source code environment. Use the unpacked compilers created +# by the build (you'll need to do "ant build" first.) +ifeq ($(OS), macosx) +TOOLROOT = ../../../../build/macosx/work/Arduino.app/Contents/Resources/Java/hardware/tools +endif +ifeq ($(OS), windows) +TOOLROOT = ../../../../build/windows/work/hardware/tools +endif + +GCCROOT = $(TOOLROOT)/avr/bin/ +AVRDUDE_CONF = -C$(TOOLROOT)/avr/etc/avrdude.conf + +else +GCCROOT = +AVRDUDE_CONF = +endif +# +# End of build environment code. + + +# the efuse should really be 0xf8; since, however, only the lower +# three bits of that byte are used on the atmega168, avrdude gets +# confused if you specify 1's for the higher bits, see: +# http://tinker.it/now/2007/02/24/the-tale-of-avrdude-atmega168-and-extended-bits-fuses/ +# +# similarly, the lock bits should be 0xff instead of 0x3f (to +# unlock the bootloader section) and 0xcf instead of 0x2f (to +# lock it), but since the high two bits of the lock byte are +# unused, avrdude would get confused. + +ISPFUSES = $(GCCROOT)avrdude $(AVRDUDE_CONF) -c $(ISPTOOL) \ + -p $(MCU_TARGET) -P $(ISPPORT) $(ISPSPEED) \ + -e -u -U lock:w:0x3f:m -U efuse:w:0x$(EFUSE):m \ + -U hfuse:w:0x$(HFUSE):m -U lfuse:w:0x$(LFUSE):m +ISPFLASH = $(GCCROOT)avrdude $(AVRDUDE_CONF) -c $(ISPTOOL) \ + -p $(MCU_TARGET) -P $(ISPPORT) $(ISPSPEED) \ + -U flash:w:$(PROGRAM)_$(TARGET).hex -U lock:w:0x2f:m + +STK500 = "C:\Program Files\Atmel\AVR Tools\STK500\Stk500.exe" +STK500-1 = $(STK500) -e -d$(MCU_TARGET) -pf -vf -if$(PROGRAM)_$(TARGET).hex \ +-lFF -LFF -f$(HFUSE)$(LFUSE) -EF8 -ms -q -cUSB -I200kHz -s -wt +STK500-2 = $(STK500) -d$(MCU_TARGET) -ms -q -lCF -LCF -cUSB -I200kHz -s -wt + +OBJ = $(PROGRAM).o +OPTIMIZE = -Os -fno-inline-small-functions -fno-split-wide-types +# -mshort-calls + +DEFS = +LIBS = + +CC = $(GCCROOT)avr-gcc + +# Override is only needed by avr-lib build system. + +override CFLAGS = -g -Wall $(OPTIMIZE) -mmcu=$(MCU_TARGET) -DF_CPU=$(AVR_FREQ) $(DEFS) +override LDFLAGS = $(LDSECTIONS) -Wl,--relax -Wl,--gc-sections -nostartfiles -nostdlib + +OBJCOPY = $(GCCROOT)avr-objcopy +OBJDUMP = $(call fixpath,$(GCCROOT)avr-objdump) + +SIZE = $(GCCROOT)avr-size + + + +#Voice board test +# ATmega328 +# +#atmega328: TARGET = atmega328p +#atmega328: MCU_TARGET = atmega328p +#atmega328: CFLAGS += '-DLED_START_FLASHES=0' '-DBAUD_RATE=38400' +#atmega328: AVR_FREQ = 12000000L +#atmega328: LDSECTIONS = -Wl,--section-start=.text=0x7e00 -Wl,--section-start=.version=0x7ffe +#atmega328: $(PROGRAM)_atmega328.hex +#atmega328: $(PROGRAM)_atmega328.lst + +atmega328: TARGET = atmega328 +atmega328: MCU_TARGET = atmega328p +atmega328: CFLAGS += '-DLED_START_FLASHES=0' '-DBAUD_RATE=57600' +atmega328: AVR_FREQ = 16000000L +atmega328: LDSECTIONS = -Wl,--section-start=.text=0x7e00 -Wl,--section-start=.version=0x7ffe +atmega328: $(PROGRAM)_atmega328_16.hex +atmega328: $(PROGRAM)_atmega328_16.lst + + +xmega32D4: TARGET = atxmega32d4 +xmega32D4: MCU_TARGET = atxmega32d4 +xmega32D4: CFLAGS += '-DLED_START_FLASHES=0' '-DBAUD_RATE=57600' +xmega32D4: AVR_FREQ = 32000000L +xmega32D4: LDSECTIONS = -Wl,--section-start=.text=0x8000 +xmega32D4: $(PROGRAM)_xmega32d4.hex +xmega32D4: $(PROGRAM)_xmega32d4.lst + + +# Test platforms +# Virtual boot block test +virboot328: TARGET = atmega328 +virboot328: MCU_TARGET = atmega328p +virboot328: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=38400' '-DVIRTUAL_BOOT' +virboot328: AVR_FREQ = 16000000L +virboot328: LDSECTIONS = -Wl,--section-start=.text=0x7e00 -Wl,--section-start=.version=0x7ffe +virboot328: $(PROGRAM)_atmega328.hex +virboot328: $(PROGRAM)_atmega328.lst + +# 20MHz clocked platforms +# +# These are capable of 230400 baud, or 38400 baud on PC (Arduino Avrdude issue) +# + +pro20: TARGET = pro_20mhz +pro20: MCU_TARGET = atmega168 +pro20: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=38400' +pro20: AVR_FREQ = 20000000L +pro20: $(PROGRAM)_pro_20mhz.hex +pro20: $(PROGRAM)_pro_20mhz.lst + +pro20_isp: pro20 +pro20_isp: TARGET = pro_20mhz +# 2.7V brownout +pro20_isp: HFUSE = DD +# Full swing xtal (20MHz) 258CK/14CK+4.1ms +pro20_isp: LFUSE = C6 +# 512 byte boot +pro20_isp: EFUSE = 04 +pro20_isp: isp + +# 16MHz clocked platforms +# +# These are capable of 230400 baud, or 38400 baud on PC (Arduino Avrdude issue) +# + +pro16: TARGET = pro_16MHz +pro16: MCU_TARGET = atmega168 +pro16: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=38400' +pro16: AVR_FREQ = 16000000L +pro16: $(PROGRAM)_pro_16MHz.hex +pro16: $(PROGRAM)_pro_16MHz.lst + +pro16_isp: pro16 +pro16_isp: TARGET = pro_16MHz +# 2.7V brownout +pro16_isp: HFUSE = DD +# Full swing xtal (20MHz) 258CK/14CK+4.1ms +pro16_isp: LFUSE = C6 +# 512 byte boot +pro16_isp: EFUSE = 04 +pro16_isp: isp + +# Diecimila, Duemilanove with m168, and NG use identical bootloaders +# Call it "atmega168" for generality and clarity, keep "diecimila" for +# backward compatibility of makefile +# +atmega168: TARGET = atmega168 +atmega168: MCU_TARGET = atmega168 +atmega168: CFLAGS += '-DLED_START_FLASHES=0' '-DBAUD_RATE=38400' +atmega168: AVR_FREQ = 12000000L +atmega168: $(PROGRAM)_atmega168.hex +atmega168: $(PROGRAM)_atmega168.lst + +atmega168_isp: atmega168 +atmega168_isp: TARGET = atmega168 +# 2.7V brownout +atmega168_isp: HFUSE = DD +# Low power xtal (16MHz) 16KCK/14CK+65ms +atmega168_isp: LFUSE = FF +# 512 byte boot +atmega168_isp: EFUSE = 04 +atmega168_isp: isp + +diecimila: TARGET = diecimila +diecimila: MCU_TARGET = atmega168 +diecimila: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=38400' +diecimila: AVR_FREQ = 16000000L +diecimila: $(PROGRAM)_diecimila.hex +diecimila: $(PROGRAM)_diecimila.lst + +diecimila_isp: diecimila +diecimila_isp: TARGET = diecimila +# 2.7V brownout +diecimila_isp: HFUSE = DD +# Low power xtal (16MHz) 16KCK/14CK+65ms +diecimila_isp: LFUSE = FF +# 512 byte boot +diecimila_isp: EFUSE = 04 +diecimila_isp: isp + +atmega328_isp: atmega328 +atmega328_isp: TARGET = atmega328 +atmega328_isp: MCU_TARGET = atmega328p +# 512 byte boot, SPIEN +atmega328_isp: HFUSE = DE +# Low power xtal (16MHz) 16KCK/14CK+65ms +atmega328_isp: LFUSE = FF +# 2.7V brownout +atmega328_isp: EFUSE = FD +atmega328_isp: isp + +atmega1284: TARGET = atmega1284p +atmega1284: MCU_TARGET = atmega1284p +atmega1284: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=38400' '-DBIGBOOT' +atmega1284: AVR_FREQ = 16000000L +atmega1284: LDSECTIONS = -Wl,--section-start=.text=0x1fc00 -Wl,--section-start=.version=0x1fffe +atmega1284: $(PROGRAM)_atmega1284p.hex +atmega1284: $(PROGRAM)_atmega1284p.lst + +atmega1284_isp: atmega1284 +atmega1284_isp: TARGET = atmega1284p +atmega1284_isp: MCU_TARGET = atmega1284p +# 1024 byte boot +atmega1284_isp: HFUSE = DE +# Low power xtal (16MHz) 16KCK/14CK+65ms +atmega1284_isp: LFUSE = FF +# 2.7V brownout +atmega1284_isp: EFUSE = FD +atmega1284_isp: isp + +# Sanguino has a minimum boot size of 1024 bytes, so enable extra functions +# +sanguino: TARGET = atmega644p +sanguino: MCU_TARGET = atmega644p +sanguino: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=38400' '-DBIGBOOT' +sanguino: AVR_FREQ = 16000000L +sanguino: LDSECTIONS = -Wl,--section-start=.text=0xfc00 -Wl,--section-start=.version=0xfffe +sanguino: $(PROGRAM)_atmega644p.hex +sanguino: $(PROGRAM)_atmega644p.lst + +sanguino_isp: sanguino +sanguino_isp: TARGET = atmega644p +sanguino_isp: MCU_TARGET = atmega644p +# 1024 byte boot +sanguino_isp: HFUSE = DE +# Low power xtal (16MHz) 16KCK/14CK+65ms +sanguino_isp: LFUSE = FF +# 2.7V brownout +sanguino_isp: EFUSE = FD +sanguino_isp: isp + +# Mega has a minimum boot size of 1024 bytes, so enable extra functions +#mega: TARGET = atmega1280 +mega1280: MCU_TARGET = atmega1280 +mega1280: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=38400' '-DBIGBOOT' +mega1280: AVR_FREQ = 16000000L +mega1280: LDSECTIONS = -Wl,--section-start=.text=0x1fc00 -Wl,--section-start=.version=0x1fffe +mega1280: $(PROGRAM)_atmega1280.hex +mega1280: $(PROGRAM)_atmega1280.lst + +mega1280_isp: mega +mega1280_isp: TARGET = atmega1280 +mega1280_isp: MCU_TARGET = atmega1280 +# 1024 byte boot +mega1280_isp: HFUSE = DE +# Low power xtal (16MHz) 16KCK/14CK+65ms +mega1280_isp: LFUSE = FF +# 2.7V brownout +mega1280_isp: EFUSE = FD +mega1280_isp: isp + +# ATmega8 +# +atmega8: TARGET = atmega8 +atmega8: MCU_TARGET = atmega8 +atmega8: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=38400' +atmega8: AVR_FREQ = 16000000L +atmega8: LDSECTIONS = -Wl,--section-start=.text=0x1e00 -Wl,--section-start=.version=0x1ffe +atmega8: $(PROGRAM)_atmega8.hex +atmega8: $(PROGRAM)_atmega8.lst + +atmega8_isp: atmega8 +atmega8_isp: TARGET = atmega8 +atmega8_isp: MCU_TARGET = atmega8 +# SPIEN, CKOPT, Bootsize=512B +atmega8_isp: HFUSE = CC +# 2.7V brownout, Low power xtal (16MHz) 16KCK/14CK+65ms +atmega8_isp: LFUSE = BF +atmega8_isp: isp + +# ATmega88 +# +atmega88: TARGET = atmega88 +atmega88: MCU_TARGET = atmega88 +atmega88: CFLAGS += '-DLED_START_FLASHES=0' '-DBAUD_RATE=38400' +atmega88: AVR_FREQ = 12000000L +atmega88: LDSECTIONS = -Wl,--section-start=.text=0x1e00 -Wl,--section-start=.version=0x1ffe +atmega88: $(PROGRAM)_atmega88.hex +atmega88: $(PROGRAM)_atmega88.lst + +atmega88_isp: atmega88 +atmega88_isp: TARGET = atmega88 +atmega88_isp: MCU_TARGET = atmega88 +# 2.7V brownout +atmega88_isp: HFUSE = DD +# Low power xtal (16MHz) 16KCK/14CK+65ms +atemga88_isp: LFUSE = FF +# 512 byte boot +atmega88_isp: EFUSE = 04 +atmega88_isp: isp + + +# 8MHz clocked platforms +# +# These are capable of 38400 baud +# + +lilypad: TARGET = lilypad +lilypad: MCU_TARGET = atmega168 +lilypad: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=38400' +lilypad: AVR_FREQ = 8000000L +lilypad: $(PROGRAM)_lilypad.hex +lilypad: $(PROGRAM)_lilypad.lst + +lilypad_isp: lilypad +lilypad_isp: TARGET = lilypad +# 2.7V brownout +lilypad_isp: HFUSE = DD +# Internal 8MHz osc (8MHz) Slow rising power +lilypad_isp: LFUSE = E2 +# 512 byte boot +lilypad_isp: EFUSE = 04 +lilypad_isp: isp + +lilypad_resonator: TARGET = lilypad_resonator +lilypad_resonator: MCU_TARGET = atmega168 +lilypad_resonator: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=38400' +lilypad_resonator: AVR_FREQ = 8000000L +lilypad_resonator: $(PROGRAM)_lilypad_resonator.hex +lilypad_resonator: $(PROGRAM)_lilypad_resonator.lst + +lilypad_resonator_isp: lilypad_resonator +lilypad_resonator_isp: TARGET = lilypad_resonator +# 2.7V brownout +lilypad_resonator_isp: HFUSE = DD +# Full swing xtal (20MHz) 258CK/14CK+4.1ms +lilypad_resonator_isp: LFUSE = C6 +# 512 byte boot +lilypad_resonator_isp: EFUSE = 04 +lilypad_resonator_isp: isp + +pro8: TARGET = pro_8MHz +pro8: MCU_TARGET = atmega168 +pro8: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=38400' +pro8: AVR_FREQ = 8000000L +pro8: $(PROGRAM)_pro_8MHz.hex +pro8: $(PROGRAM)_pro_8MHz.lst + +pro8_isp: pro8 +pro8_isp: TARGET = pro_8MHz +# 2.7V brownout +pro8_isp: HFUSE = DD +# Full swing xtal (20MHz) 258CK/14CK+4.1ms +pro8_isp: LFUSE = C6 +# 512 byte boot +pro8_isp: EFUSE = 04 +pro8_isp: isp + +atmega328_pro8: TARGET = atmega328_pro_8MHz +atmega328_pro8: MCU_TARGET = atmega328p +atmega328_pro8: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=38400' +atmega328_pro8: AVR_FREQ = 8000000L +atmega328_pro8: LDSECTIONS = -Wl,--section-start=.text=0x7e00 -Wl,--section-start=.version=0x7ffe +atmega328_pro8: $(PROGRAM)_atmega328_pro_8MHz.hex +atmega328_pro8: $(PROGRAM)_atmega328_pro_8MHz.lst + +atmega328_pro8_isp: atmega328_pro8 +atmega328_pro8_isp: TARGET = atmega328_pro_8MHz +atmega328_pro8_isp: MCU_TARGET = atmega328p +# 512 byte boot, SPIEN +atmega328_pro8_isp: HFUSE = DE +# Low power xtal (16MHz) 16KCK/14CK+65ms +atmega328_pro8_isp: LFUSE = FF +# 2.7V brownout +atmega328_pro8_isp: EFUSE = DE +atmega328_pro8_isp: isp + +# 1MHz clocked platforms +# +# These are capable of 9600 baud +# + +luminet: TARGET = luminet +luminet: MCU_TARGET = attiny84 +luminet: CFLAGS += '-DLED_START_FLASHES=3' '-DSOFT_UART' '-DBAUD_RATE=9600' +luminet: CFLAGS += '-DVIRTUAL_BOOT_PARTITION' +luminet: AVR_FREQ = 1000000L +luminet: LDSECTIONS = -Wl,--section-start=.text=0x1d00 -Wl,--section-start=.version=0x1efe +luminet: $(PROGRAM)_luminet.hex +luminet: $(PROGRAM)_luminet.lst + +luminet_isp: luminet +luminet_isp: TARGET = luminet +luminet_isp: MCU_TARGET = attiny84 +# Brownout disabled +luminet_isp: HFUSE = DF +# 1MHz internal oscillator, slowly rising power +luminet_isp: LFUSE = 62 +# Self-programming enable +luminet_isp: EFUSE = FE +luminet_isp: isp + +# +# Generic build instructions +# +# + +isp: $(TARGET) + $(ISPFUSES) + $(ISPFLASH) + +isp-stk500: $(PROGRAM)_$(TARGET).hex + $(STK500-1) + $(STK500-2) + +%.elf: $(OBJ) + $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS) + $(SIZE) $@ + +clean: + rm -rf *.o *.elf *.lst *.map *.sym *.lss *.eep *.srec *.bin *.hex + +%.lst: %.elf + $(OBJDUMP) -h -S $< > $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -j .version --set-section-flags .version=alloc,load -O ihex $< $@ + +%.srec: %.elf + $(OBJCOPY) -j .text -j .data -j .version --set-section-flags .version=alloc,load -O srec $< $@ + +%.bin: %.elf + $(OBJCOPY) -j .text -j .data -j .version --set-section-flags .version=alloc,load -O binary $< $@ diff --git a/BootLoaders/AtmegaMultiBoot/Source/boot.h b/BootLoaders/AtmegaMultiBoot/Source/boot.h new file mode 100644 index 0000000..2639cd8 --- /dev/null +++ b/BootLoaders/AtmegaMultiBoot/Source/boot.h @@ -0,0 +1,848 @@ +/* Modified to use out for SPM access +** Peter Knight, Optiboot project http://optiboot.googlecode.com +** +** Todo: Tidy up +** +** "_short" routines execute 1 cycle faster and use 1 less word of flash +** by using "out" instruction instead of "sts". +** +** Additional elpm variants that trust the value of RAMPZ +*/ + +/* Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007 Eric B. Weddington + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + * Neither the name of the copyright holders nor the names of + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. */ + +/* $Id: boot.h,v 1.27.2.3 2008/09/30 13:58:48 arcanum Exp $ */ + +#ifndef _AVR_BOOT_H_ +#define _AVR_BOOT_H_ 1 + +/** \file */ +/** \defgroup avr_boot : Bootloader Support Utilities + \code + #include + #include + \endcode + + The macros in this module provide a C language interface to the + bootloader support functionality of certain AVR processors. These + macros are designed to work with all sizes of flash memory. + + Global interrupts are not automatically disabled for these macros. It + is left up to the programmer to do this. See the code example below. + Also see the processor datasheet for caveats on having global interrupts + enabled during writing of the Flash. + + \note Not all AVR processors provide bootloader support. See your + processor datasheet to see if it provides bootloader support. + + \todo From email with Marek: On smaller devices (all except ATmega64/128), + __SPM_REG is in the I/O space, accessible with the shorter "in" and "out" + instructions - since the boot loader has a limited size, this could be an + important optimization. + + \par API Usage Example + The following code shows typical usage of the boot API. + + \code + #include + #include + #include + + void boot_program_page (uint32_t page, uint8_t *buf) + { + uint16_t i; + uint8_t sreg; + + // Disable interrupts. + + sreg = SREG; + cli(); + + eeprom_busy_wait (); + + boot_page_erase (page); + boot_spm_busy_wait (); // Wait until the memory is erased. + + for (i=0; i +#include +#include +#include + +/* Check for SPM Control Register in processor. */ +#if defined (SPMCSR) +# define __SPM_REG SPMCSR +#elif defined (SPMCR) +# define __SPM_REG SPMCR +#else +# error AVR processor does not provide bootloader support! +#endif + + +/* Check for SPM Enable bit. */ +#if defined(SPMEN) +# define __SPM_ENABLE SPMEN +#elif defined(SELFPRGEN) +# define __SPM_ENABLE SELFPRGEN +#else +# error Cannot find SPM Enable bit definition! +#endif + +/** \ingroup avr_boot + \def BOOTLOADER_SECTION + + Used to declare a function or variable to be placed into a + new section called .bootloader. This section and its contents + can then be relocated to any address (such as the bootloader + NRWW area) at link-time. */ + +#define BOOTLOADER_SECTION __attribute__ ((section (".bootloader"))) + +/* Create common bit definitions. */ +#ifdef ASB +#define __COMMON_ASB ASB +#else +#define __COMMON_ASB RWWSB +#endif + +#ifdef ASRE +#define __COMMON_ASRE ASRE +#else +#define __COMMON_ASRE RWWSRE +#endif + +/* Define the bit positions of the Boot Lock Bits. */ + +#define BLB12 5 +#define BLB11 4 +#define BLB02 3 +#define BLB01 2 + +/** \ingroup avr_boot + \def boot_spm_interrupt_enable() + Enable the SPM interrupt. */ + +#define boot_spm_interrupt_enable() (__SPM_REG |= (uint8_t)_BV(SPMIE)) + +/** \ingroup avr_boot + \def boot_spm_interrupt_disable() + Disable the SPM interrupt. */ + +#define boot_spm_interrupt_disable() (__SPM_REG &= (uint8_t)~_BV(SPMIE)) + +/** \ingroup avr_boot + \def boot_is_spm_interrupt() + Check if the SPM interrupt is enabled. */ + +#define boot_is_spm_interrupt() (__SPM_REG & (uint8_t)_BV(SPMIE)) + +/** \ingroup avr_boot + \def boot_rww_busy() + Check if the RWW section is busy. */ + +#define boot_rww_busy() (__SPM_REG & (uint8_t)_BV(__COMMON_ASB)) + +/** \ingroup avr_boot + \def boot_spm_busy() + Check if the SPM instruction is busy. */ + +#define boot_spm_busy() (__SPM_REG & (uint8_t)_BV(__SPM_ENABLE)) + +/** \ingroup avr_boot + \def boot_spm_busy_wait() + Wait while the SPM instruction is busy. */ + +#define boot_spm_busy_wait() do{}while(boot_spm_busy()) + +#define __BOOT_PAGE_ERASE (_BV(__SPM_ENABLE) | _BV(PGERS)) +#define __BOOT_PAGE_WRITE (_BV(__SPM_ENABLE) | _BV(PGWRT)) +#define __BOOT_PAGE_FILL _BV(__SPM_ENABLE) +#define __BOOT_RWW_ENABLE (_BV(__SPM_ENABLE) | _BV(__COMMON_ASRE)) +#define __BOOT_LOCK_BITS_SET (_BV(__SPM_ENABLE) | _BV(BLBSET)) + +#define __boot_page_fill_short(address, data) \ +(__extension__({ \ + __asm__ __volatile__ \ + ( \ + "movw r0, %3\n\t" \ + "out %0, %1\n\t" \ + "spm\n\t" \ + "clr r1\n\t" \ + : \ + : "i" (_SFR_IO_ADDR(__SPM_REG)), \ + "r" ((uint8_t)__BOOT_PAGE_FILL), \ + "z" ((uint16_t)address), \ + "r" ((uint16_t)data) \ + : "r0" \ + ); \ +})) + +#define __boot_page_fill_normal(address, data) \ +(__extension__({ \ + __asm__ __volatile__ \ + ( \ + "movw r0, %3\n\t" \ + "sts %0, %1\n\t" \ + "spm\n\t" \ + "clr r1\n\t" \ + : \ + : "i" (_SFR_MEM_ADDR(__SPM_REG)), \ + "r" ((uint8_t)__BOOT_PAGE_FILL), \ + "z" ((uint16_t)address), \ + "r" ((uint16_t)data) \ + : "r0" \ + ); \ +})) + +#define __boot_page_fill_alternate(address, data)\ +(__extension__({ \ + __asm__ __volatile__ \ + ( \ + "movw r0, %3\n\t" \ + "sts %0, %1\n\t" \ + "spm\n\t" \ + ".word 0xffff\n\t" \ + "nop\n\t" \ + "clr r1\n\t" \ + : \ + : "i" (_SFR_MEM_ADDR(__SPM_REG)), \ + "r" ((uint8_t)__BOOT_PAGE_FILL), \ + "z" ((uint16_t)address), \ + "r" ((uint16_t)data) \ + : "r0" \ + ); \ +})) + +#define __boot_page_fill_extended(address, data) \ +(__extension__({ \ + __asm__ __volatile__ \ + ( \ + "movw r0, %4\n\t" \ + "movw r30, %A3\n\t" \ + "sts %1, %C3\n\t" \ + "sts %0, %2\n\t" \ + "spm\n\t" \ + "clr r1\n\t" \ + : \ + : "i" (_SFR_MEM_ADDR(__SPM_REG)), \ + "i" (_SFR_MEM_ADDR(RAMPZ)), \ + "r" ((uint8_t)__BOOT_PAGE_FILL), \ + "r" ((uint32_t)address), \ + "r" ((uint16_t)data) \ + : "r0", "r30", "r31" \ + ); \ +})) + +#define __boot_page_fill_extended_short(address, data) \ +(__extension__({ \ + __asm__ __volatile__ \ + ( \ + "movw r0, %4\n\t" \ + "movw r30, %A3\n\t" \ + "out %1, %C3\n\t" \ + "out %0, %2\n\t" \ + "spm\n\t" \ + "clr r1\n\t" \ + : \ + : "i" (_SFR_IO_ADDR(__SPM_REG)), \ + "i" (_SFR_IO_ADDR(RAMPZ)), \ + "r" ((uint8_t)__BOOT_PAGE_FILL), \ + "r" ((uint32_t)address), \ + "r" ((uint16_t)data) \ + : "r0", "r30", "r31" \ + ); \ +})) + +#define __boot_page_erase_short(address) \ +(__extension__({ \ + __asm__ __volatile__ \ + ( \ + "out %0, %1\n\t" \ + "spm\n\t" \ + : \ + : "i" (_SFR_IO_ADDR(__SPM_REG)), \ + "r" ((uint8_t)__BOOT_PAGE_ERASE), \ + "z" ((uint16_t)address) \ + ); \ +})) + + +#define __boot_page_erase_normal(address) \ +(__extension__({ \ + __asm__ __volatile__ \ + ( \ + "sts %0, %1\n\t" \ + "spm\n\t" \ + : \ + : "i" (_SFR_MEM_ADDR(__SPM_REG)), \ + "r" ((uint8_t)__BOOT_PAGE_ERASE), \ + "z" ((uint16_t)address) \ + ); \ +})) + +#define __boot_page_erase_alternate(address) \ +(__extension__({ \ + __asm__ __volatile__ \ + ( \ + "sts %0, %1\n\t" \ + "spm\n\t" \ + ".word 0xffff\n\t" \ + "nop\n\t" \ + : \ + : "i" (_SFR_MEM_ADDR(__SPM_REG)), \ + "r" ((uint8_t)__BOOT_PAGE_ERASE), \ + "z" ((uint16_t)address) \ + ); \ +})) + +#define __boot_page_erase_extended(address) \ +(__extension__({ \ + __asm__ __volatile__ \ + ( \ + "movw r30, %A3\n\t" \ + "sts %1, %C3\n\t" \ + "sts %0, %2\n\t" \ + "spm\n\t" \ + : \ + : "i" (_SFR_MEM_ADDR(__SPM_REG)), \ + "i" (_SFR_MEM_ADDR(RAMPZ)), \ + "r" ((uint8_t)__BOOT_PAGE_ERASE), \ + "r" ((uint32_t)address) \ + : "r30", "r31" \ + ); \ +})) +#define __boot_page_erase_extended_short(address) \ +(__extension__({ \ + __asm__ __volatile__ \ + ( \ + "movw r30, %A3\n\t" \ + "out %1, %C3\n\t" \ + "out %0, %2\n\t" \ + "spm\n\t" \ + : \ + : "i" (_SFR_IO_ADDR(__SPM_REG)), \ + "i" (_SFR_IO_ADDR(RAMPZ)), \ + "r" ((uint8_t)__BOOT_PAGE_ERASE), \ + "r" ((uint32_t)address) \ + : "r30", "r31" \ + ); \ +})) + +#define __boot_page_write_short(address) \ +(__extension__({ \ + __asm__ __volatile__ \ + ( \ + "out %0, %1\n\t" \ + "spm\n\t" \ + : \ + : "i" (_SFR_IO_ADDR(__SPM_REG)), \ + "r" ((uint8_t)__BOOT_PAGE_WRITE), \ + "z" ((uint16_t)address) \ + ); \ +})) + +#define __boot_page_write_normal(address) \ +(__extension__({ \ + __asm__ __volatile__ \ + ( \ + "sts %0, %1\n\t" \ + "spm\n\t" \ + : \ + : "i" (_SFR_MEM_ADDR(__SPM_REG)), \ + "r" ((uint8_t)__BOOT_PAGE_WRITE), \ + "z" ((uint16_t)address) \ + ); \ +})) + +#define __boot_page_write_alternate(address) \ +(__extension__({ \ + __asm__ __volatile__ \ + ( \ + "sts %0, %1\n\t" \ + "spm\n\t" \ + ".word 0xffff\n\t" \ + "nop\n\t" \ + : \ + : "i" (_SFR_MEM_ADDR(__SPM_REG)), \ + "r" ((uint8_t)__BOOT_PAGE_WRITE), \ + "z" ((uint16_t)address) \ + ); \ +})) + +#define __boot_page_write_extended(address) \ +(__extension__({ \ + __asm__ __volatile__ \ + ( \ + "movw r30, %A3\n\t" \ + "sts %1, %C3\n\t" \ + "sts %0, %2\n\t" \ + "spm\n\t" \ + : \ + : "i" (_SFR_MEM_ADDR(__SPM_REG)), \ + "i" (_SFR_MEM_ADDR(RAMPZ)), \ + "r" ((uint8_t)__BOOT_PAGE_WRITE), \ + "r" ((uint32_t)address) \ + : "r30", "r31" \ + ); \ +})) +#define __boot_page_write_extended_short(address) \ +(__extension__({ \ + __asm__ __volatile__ \ + ( \ + "movw r30, %A3\n\t" \ + "out %1, %C3\n\t" \ + "out %0, %2\n\t" \ + "spm\n\t" \ + : \ + : "i" (_SFR_IO_ADDR(__SPM_REG)), \ + "i" (_SFR_IO_ADDR(RAMPZ)), \ + "r" ((uint8_t)__BOOT_PAGE_WRITE), \ + "r" ((uint32_t)address) \ + : "r30", "r31" \ + ); \ +})) + +#define __boot_rww_enable_short() \ +(__extension__({ \ + __asm__ __volatile__ \ + ( \ + "out %0, %1\n\t" \ + "spm\n\t" \ + : \ + : "i" (_SFR_IO_ADDR(__SPM_REG)), \ + "r" ((uint8_t)__BOOT_RWW_ENABLE) \ + ); \ +})) + +#define __boot_rww_enable() \ +(__extension__({ \ + __asm__ __volatile__ \ + ( \ + "sts %0, %1\n\t" \ + "spm\n\t" \ + : \ + : "i" (_SFR_MEM_ADDR(__SPM_REG)), \ + "r" ((uint8_t)__BOOT_RWW_ENABLE) \ + ); \ +})) + +#define __boot_rww_enable_alternate() \ +(__extension__({ \ + __asm__ __volatile__ \ + ( \ + "sts %0, %1\n\t" \ + "spm\n\t" \ + ".word 0xffff\n\t" \ + "nop\n\t" \ + : \ + : "i" (_SFR_MEM_ADDR(__SPM_REG)), \ + "r" ((uint8_t)__BOOT_RWW_ENABLE) \ + ); \ +})) + +/* From the mega16/mega128 data sheets (maybe others): + + Bits by SPM To set the Boot Loader Lock bits, write the desired data to + R0, write "X0001001" to SPMCR and execute SPM within four clock cycles + after writing SPMCR. The only accessible Lock bits are the Boot Lock bits + that may prevent the Application and Boot Loader section from any + software update by the MCU. + + If bits 5..2 in R0 are cleared (zero), the corresponding Boot Lock bit + will be programmed if an SPM instruction is executed within four cycles + after BLBSET and SPMEN (or SELFPRGEN) are set in SPMCR. The Z-pointer is + don't care during this operation, but for future compatibility it is + recommended to load the Z-pointer with $0001 (same as used for reading the + Lock bits). For future compatibility It is also recommended to set bits 7, + 6, 1, and 0 in R0 to 1 when writing the Lock bits. When programming the + Lock bits the entire Flash can be read during the operation. */ + +#define __boot_lock_bits_set_short(lock_bits) \ +(__extension__({ \ + uint8_t value = (uint8_t)(~(lock_bits)); \ + __asm__ __volatile__ \ + ( \ + "ldi r30, 1\n\t" \ + "ldi r31, 0\n\t" \ + "mov r0, %2\n\t" \ + "out %0, %1\n\t" \ + "spm\n\t" \ + : \ + : "i" (_SFR_IO_ADDR(__SPM_REG)), \ + "r" ((uint8_t)__BOOT_LOCK_BITS_SET), \ + "r" (value) \ + : "r0", "r30", "r31" \ + ); \ +})) + +#define __boot_lock_bits_set(lock_bits) \ +(__extension__({ \ + uint8_t value = (uint8_t)(~(lock_bits)); \ + __asm__ __volatile__ \ + ( \ + "ldi r30, 1\n\t" \ + "ldi r31, 0\n\t" \ + "mov r0, %2\n\t" \ + "sts %0, %1\n\t" \ + "spm\n\t" \ + : \ + : "i" (_SFR_MEM_ADDR(__SPM_REG)), \ + "r" ((uint8_t)__BOOT_LOCK_BITS_SET), \ + "r" (value) \ + : "r0", "r30", "r31" \ + ); \ +})) + +#define __boot_lock_bits_set_alternate(lock_bits) \ +(__extension__({ \ + uint8_t value = (uint8_t)(~(lock_bits)); \ + __asm__ __volatile__ \ + ( \ + "ldi r30, 1\n\t" \ + "ldi r31, 0\n\t" \ + "mov r0, %2\n\t" \ + "sts %0, %1\n\t" \ + "spm\n\t" \ + ".word 0xffff\n\t" \ + "nop\n\t" \ + : \ + : "i" (_SFR_MEM_ADDR(__SPM_REG)), \ + "r" ((uint8_t)__BOOT_LOCK_BITS_SET), \ + "r" (value) \ + : "r0", "r30", "r31" \ + ); \ +})) + +/* + Reading lock and fuse bits: + + Similarly to writing the lock bits above, set BLBSET and SPMEN (or + SELFPRGEN) bits in __SPMREG, and then (within four clock cycles) issue an + LPM instruction. + + Z address: contents: + 0x0000 low fuse bits + 0x0001 lock bits + 0x0002 extended fuse bits + 0x0003 high fuse bits + + Sounds confusing, doesn't it? + + Unlike the macros in pgmspace.h, no need to care for non-enhanced + cores here as these old cores do not provide SPM support anyway. + */ + +/** \ingroup avr_boot + \def GET_LOW_FUSE_BITS + address to read the low fuse bits, using boot_lock_fuse_bits_get + */ +#define GET_LOW_FUSE_BITS (0x0000) +/** \ingroup avr_boot + \def GET_LOCK_BITS + address to read the lock bits, using boot_lock_fuse_bits_get + */ +#define GET_LOCK_BITS (0x0001) +/** \ingroup avr_boot + \def GET_EXTENDED_FUSE_BITS + address to read the extended fuse bits, using boot_lock_fuse_bits_get + */ +#define GET_EXTENDED_FUSE_BITS (0x0002) +/** \ingroup avr_boot + \def GET_HIGH_FUSE_BITS + address to read the high fuse bits, using boot_lock_fuse_bits_get + */ +#define GET_HIGH_FUSE_BITS (0x0003) + +/** \ingroup avr_boot + \def boot_lock_fuse_bits_get(address) + + Read the lock or fuse bits at \c address. + + Parameter \c address can be any of GET_LOW_FUSE_BITS, + GET_LOCK_BITS, GET_EXTENDED_FUSE_BITS, or GET_HIGH_FUSE_BITS. + + \note The lock and fuse bits returned are the physical values, + i.e. a bit returned as 0 means the corresponding fuse or lock bit + is programmed. + */ +#define boot_lock_fuse_bits_get_short(address) \ +(__extension__({ \ + uint8_t __result; \ + __asm__ __volatile__ \ + ( \ + "ldi r30, %3\n\t" \ + "ldi r31, 0\n\t" \ + "out %1, %2\n\t" \ + "lpm %0, Z\n\t" \ + : "=r" (__result) \ + : "i" (_SFR_IO_ADDR(__SPM_REG)), \ + "r" ((uint8_t)__BOOT_LOCK_BITS_SET), \ + "M" (address) \ + : "r0", "r30", "r31" \ + ); \ + __result; \ +})) + +#define boot_lock_fuse_bits_get(address) \ +(__extension__({ \ + uint8_t __result; \ + __asm__ __volatile__ \ + ( \ + "ldi r30, %3\n\t" \ + "ldi r31, 0\n\t" \ + "sts %1, %2\n\t" \ + "lpm %0, Z\n\t" \ + : "=r" (__result) \ + : "i" (_SFR_MEM_ADDR(__SPM_REG)), \ + "r" ((uint8_t)__BOOT_LOCK_BITS_SET), \ + "M" (address) \ + : "r0", "r30", "r31" \ + ); \ + __result; \ +})) + +/** \ingroup avr_boot + \def boot_signature_byte_get(address) + + Read the Signature Row byte at \c address. For some MCU types, + this function can also retrieve the factory-stored oscillator + calibration bytes. + + Parameter \c address can be 0-0x1f as documented by the datasheet. + \note The values are MCU type dependent. +*/ + +#define __BOOT_SIGROW_READ (_BV(__SPM_ENABLE) | _BV(SIGRD)) + +#define boot_signature_byte_get_short(addr) \ +(__extension__({ \ + uint16_t __addr16 = (uint16_t)(addr); \ + uint8_t __result; \ + __asm__ __volatile__ \ + ( \ + "out %1, %2\n\t" \ + "lpm %0, Z" "\n\t" \ + : "=r" (__result) \ + : "i" (_SFR_IO_ADDR(__SPM_REG)), \ + "r" ((uint8_t) __BOOT_SIGROW_READ), \ + "z" (__addr16) \ + ); \ + __result; \ +})) + +#define boot_signature_byte_get(addr) \ +(__extension__({ \ + uint16_t __addr16 = (uint16_t)(addr); \ + uint8_t __result; \ + __asm__ __volatile__ \ + ( \ + "sts %1, %2\n\t" \ + "lpm %0, Z" "\n\t" \ + : "=r" (__result) \ + : "i" (_SFR_MEM_ADDR(__SPM_REG)), \ + "r" ((uint8_t) __BOOT_SIGROW_READ), \ + "z" (__addr16) \ + ); \ + __result; \ +})) + +/** \ingroup avr_boot + \def boot_page_fill(address, data) + + Fill the bootloader temporary page buffer for flash + address with data word. + + \note The address is a byte address. The data is a word. The AVR + writes data to the buffer a word at a time, but addresses the buffer + per byte! So, increment your address by 2 between calls, and send 2 + data bytes in a word format! The LSB of the data is written to the lower + address; the MSB of the data is written to the higher address.*/ + +/** \ingroup avr_boot + \def boot_page_erase(address) + + Erase the flash page that contains address. + + \note address is a byte address in flash, not a word address. */ + +/** \ingroup avr_boot + \def boot_page_write(address) + + Write the bootloader temporary page buffer + to flash page that contains address. + + \note address is a byte address in flash, not a word address. */ + +/** \ingroup avr_boot + \def boot_rww_enable() + + Enable the Read-While-Write memory section. */ + +/** \ingroup avr_boot + \def boot_lock_bits_set(lock_bits) + + Set the bootloader lock bits. + + \param lock_bits A mask of which Boot Loader Lock Bits to set. + + \note In this context, a 'set bit' will be written to a zero value. + Note also that only BLBxx bits can be programmed by this command. + + For example, to disallow the SPM instruction from writing to the Boot + Loader memory section of flash, you would use this macro as such: + + \code + boot_lock_bits_set (_BV (BLB11)); + \endcode + + \note Like any lock bits, the Boot Loader Lock Bits, once set, + cannot be cleared again except by a chip erase which will in turn + also erase the boot loader itself. */ + +/* Normal versions of the macros use 16-bit addresses. + Extended versions of the macros use 32-bit addresses. + Alternate versions of the macros use 16-bit addresses and require special + instruction sequences after LPM. + + FLASHEND is defined in the ioXXXX.h file. + USHRT_MAX is defined in . */ + +#if defined(__AVR_ATmega161__) || defined(__AVR_ATmega163__) \ + || defined(__AVR_ATmega323__) + +/* Alternate: ATmega161/163/323 and 16 bit address */ +#define boot_page_fill(address, data) __boot_page_fill_alternate(address, data) +#define boot_page_erase(address) __boot_page_erase_alternate(address) +#define boot_page_write(address) __boot_page_write_alternate(address) +#define boot_rww_enable() __boot_rww_enable_alternate() +#define boot_lock_bits_set(lock_bits) __boot_lock_bits_set_alternate(lock_bits) + +#elif (FLASHEND > USHRT_MAX) + +/* Extended: >16 bit address */ +#define boot_page_fill(address, data) __boot_page_fill_extended_short(address, data) +#define boot_page_erase(address) __boot_page_erase_extended_short(address) +#define boot_page_write(address) __boot_page_write_extended_short(address) +#define boot_rww_enable() __boot_rww_enable_short() +#define boot_lock_bits_set(lock_bits) __boot_lock_bits_set_short(lock_bits) + +#else + +/* Normal: 16 bit address */ +#define boot_page_fill(address, data) __boot_page_fill_short(address, data) +#define boot_page_erase(address) __boot_page_erase_short(address) +#define boot_page_write(address) __boot_page_write_short(address) +#define boot_rww_enable() __boot_rww_enable_short() +#define boot_lock_bits_set(lock_bits) __boot_lock_bits_set_short(lock_bits) + +#endif + +/** \ingroup avr_boot + + Same as boot_page_fill() except it waits for eeprom and spm operations to + complete before filling the page. */ + +#define boot_page_fill_safe(address, data) \ +do { \ + boot_spm_busy_wait(); \ + eeprom_busy_wait(); \ + boot_page_fill(address, data); \ +} while (0) + +/** \ingroup avr_boot + + Same as boot_page_erase() except it waits for eeprom and spm operations to + complete before erasing the page. */ + +#define boot_page_erase_safe(address) \ +do { \ + boot_spm_busy_wait(); \ + eeprom_busy_wait(); \ + boot_page_erase (address); \ +} while (0) + +/** \ingroup avr_boot + + Same as boot_page_write() except it waits for eeprom and spm operations to + complete before writing the page. */ + +#define boot_page_write_safe(address) \ +do { \ + boot_spm_busy_wait(); \ + eeprom_busy_wait(); \ + boot_page_write (address); \ +} while (0) + +/** \ingroup avr_boot + + Same as boot_rww_enable() except waits for eeprom and spm operations to + complete before enabling the RWW mameory. */ + +#define boot_rww_enable_safe() \ +do { \ + boot_spm_busy_wait(); \ + eeprom_busy_wait(); \ + boot_rww_enable(); \ +} while (0) + +/** \ingroup avr_boot + + Same as boot_lock_bits_set() except waits for eeprom and spm operations to + complete before setting the lock bits. */ + +#define boot_lock_bits_set_safe(lock_bits) \ +do { \ + boot_spm_busy_wait(); \ + eeprom_busy_wait(); \ + boot_lock_bits_set (lock_bits); \ +} while (0) + +#endif /* _AVR_BOOT_H_ */ diff --git a/BootLoaders/AtmegaMultiBoot/Source/optiboot.c b/BootLoaders/AtmegaMultiBoot/Source/optiboot.c new file mode 100644 index 0000000..2a994ff --- /dev/null +++ b/BootLoaders/AtmegaMultiBoot/Source/optiboot.c @@ -0,0 +1,891 @@ +/**********************************************************/ +/* Optiboot bootloader for Arduino */ +/* */ +/* http://optiboot.googlecode.com */ +/* */ +/* Arduino-maintained version : See README.TXT */ +/* http://code.google.com/p/arduino/ */ +/* It is the intent that changes not relevant to the */ +/* Arduino production envionment get moved from the */ +/* optiboot project to the arduino project in "lumps." */ +/* */ +/* Heavily optimised bootloader that is faster and */ +/* smaller than the Arduino standard bootloader */ +/* */ +/* Enhancements: */ +/* Fits in 512 bytes, saving 1.5K of code space */ +/* Background page erasing speeds up programming */ +/* Higher baud rate speeds up programming */ +/* Written almost entirely in C */ +/* Customisable timeout with accurate timeconstant */ +/* Optional virtual UART. No hardware UART required. */ +/* Optional virtual boot partition for devices without. */ +/* */ +/* What you lose: */ +/* Implements a skeleton STK500 protocol which is */ +/* missing several features including EEPROM */ +/* programming and non-page-aligned writes */ +/* High baud rate breaks compatibility with standard */ +/* Arduino flash settings */ +/* */ +/* Fully supported: */ +/* ATmega168 based devices (Diecimila etc) */ +/* ATmega328P based devices (Duemilanove etc) */ +/* */ +/* Beta test (believed working.) */ +/* ATmega8 based devices (Arduino legacy) */ +/* ATmega328 non-picopower devices */ +/* ATmega644P based devices (Sanguino) */ +/* ATmega1284P based devices */ +/* */ +/* Alpha test */ +/* ATmega1280 based devices (Arduino Mega) */ +/* */ +/* Work in progress: */ +/* ATtiny84 based devices (Luminet) */ +/* */ +/* Does not support: */ +/* USB based devices (eg. Teensy) */ +/* */ +/* Assumptions: */ +/* The code makes several assumptions that reduce the */ +/* code size. They are all true after a hardware reset, */ +/* but may not be true if the bootloader is called by */ +/* other means or on other hardware. */ +/* No interrupts can occur */ +/* UART and Timer 1 are set to their reset state */ +/* SP points to RAMEND */ +/* */ +/* Code builds on code, libraries and optimisations from: */ +/* stk500boot.c by Jason P. Kyle */ +/* Arduino bootloader http://arduino.cc */ +/* Spiff's 1K bootloader http://spiffie.org/know/arduino_1k_bootloader/bootloader.shtml */ +/* avr-libc project http://nongnu.org/avr-libc */ +/* Adaboot http://www.ladyada.net/library/arduino/bootloader.html */ +/* AVR305 Atmel Application Note */ +/* */ +/* This program is free software; you can redistribute it */ +/* and/or modify it under the terms of the GNU General */ +/* Public License as published by the Free Software */ +/* Foundation; either version 2 of the License, or */ +/* (at your option) any later version. */ +/* */ +/* This program is distributed in the hope that it will */ +/* be useful, but WITHOUT ANY WARRANTY; without even the */ +/* implied warranty of MERCHANTABILITY or FITNESS FOR A */ +/* PARTICULAR PURPOSE. See the GNU General Public */ +/* License for more details. */ +/* */ +/* You should have received a copy of the GNU General */ +/* Public License along with this program; if not, write */ +/* to the Free Software Foundation, Inc., */ +/* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +/* */ +/* Licence can be viewed at */ +/* http://www.fsf.org/licenses/gpl.txt */ +/* */ +/**********************************************************/ + + +/**********************************************************/ +/* */ +/* Optional defines: */ +/* */ +/**********************************************************/ +/* */ +/* BIG_BOOT: */ +/* Build a 1k bootloader, not 512 bytes. This turns on */ +/* extra functionality. */ +/* */ +/* BAUD_RATE: */ +/* Set bootloader baud rate. */ +/* */ +/* LUDICROUS_SPEED: */ +/* 230400 baud :-) */ +/* */ +/* SOFT_UART: */ +/* Use AVR305 soft-UART instead of hardware UART. */ +/* */ +/* LED_START_FLASHES: */ +/* Number of LED flashes on bootup. */ +/* */ +/* LED_DATA_FLASH: */ +/* Flash LED when transferring data. For boards without */ +/* TX or RX LEDs, or for people who like blinky lights. */ +/* */ +/* SUPPORT_EEPROM: */ +/* Support reading and writing from EEPROM. This is not */ +/* used by Arduino, so off by default. */ +/* */ +/* TIMEOUT_MS: */ +/* Bootloader timeout period, in milliseconds. */ +/* 500,1000,2000,4000,8000 supported. */ +/* */ +/* UART: */ +/* UART number (0..n) for devices with more than */ +/* one hardware uart (644P, 1284P, etc) */ +/* */ +/**********************************************************/ + +/**********************************************************/ +/* Version Numbers! */ +/* */ +/* Arduino Optiboot now includes this Version number in */ +/* the source and object code. */ +/* */ +/* Version 3 was released as zip from the optiboot */ +/* repository and was distributed with Arduino 0022. */ +/* Version 4 starts with the arduino repository commit */ +/* that brought the arduino repository up-to-date with */ +/* the optiboot source tree changes since v3. */ +/* */ +/**********************************************************/ + +/**********************************************************/ +/* Edit History: */ +/* */ +/* Nov 2012 */ +/* Specific version for 9x voice module */ +/* by Mike Blandford */ +/* Mar 2012 */ +/* 4.5 WestfW: add infrastructure for non-zero UARTS. */ +/* 4.5 WestfW: fix SIGNATURE_2 for m644 (bad in avr-libc) */ +/* Jan 2012: */ +/* 4.5 WestfW: fix NRWW value for m1284. */ +/* 4.4 WestfW: use attribute OS_main instead of naked for */ +/* main(). This allows optimizations that we */ +/* count on, which are prohibited in naked */ +/* functions due to PR42240. (keeps us less */ +/* than 512 bytes when compiler is gcc4.5 */ +/* (code from 4.3.2 remains the same.) */ +/* 4.4 WestfW and Maniacbug: Add m1284 support. This */ +/* does not change the 328 binary, so the */ +/* version number didn't change either. (?) */ +/* June 2011: */ +/* 4.4 WestfW: remove automatic soft_uart detect (didn't */ +/* know what it was doing or why.) Added a */ +/* check of the calculated BRG value instead. */ +/* Version stays 4.4; existing binaries are */ +/* not changed. */ +/* 4.4 WestfW: add initialization of address to keep */ +/* the compiler happy. Change SC'ed targets. */ +/* Return the SW version via READ PARAM */ +/* 4.3 WestfW: catch framing errors in getch(), so that */ +/* AVRISP works without HW kludges. */ +/* http://code.google.com/p/arduino/issues/detail?id=368n*/ +/* 4.2 WestfW: reduce code size, fix timeouts, change */ +/* verifySpace to use WDT instead of appstart */ +/* 4.1 WestfW: put version number in binary. */ +/**********************************************************/ + +#define OPTIBOOT_MAJVER 4 +#define OPTIBOOT_MINVER 5 + +#define MULTI_CALLED 1 + +#define MAKESTR(a) #a +#define MAKEVER(a, b) MAKESTR(a*256+b) + +//asm(" .section .version\n" +// "optiboot_version: .word " MAKEVER(OPTIBOOT_MAJVER, OPTIBOOT_MINVER) "\n" +// " .section .text\n"); + +#include +#include +#include + +// uses sts instructions, but this version uses out instructions +// This saves cycles and program memory. +#include "boot.h" + + +// We don't use as those routines have interrupt overhead we don't need. + +#include "pin_defs.h" +#include "stk500.h" + +#ifndef LED_START_FLASHES +#define LED_START_FLASHES 0 +#endif + +#ifdef LUDICROUS_SPEED +#define BAUD_RATE 230400L +#endif + +/* set the UART baud rate defaults */ +#ifndef BAUD_RATE +#if F_CPU >= 8000000L +#define BAUD_RATE 38400L // Highest rate Avrdude win32 will support +#elsif F_CPU >= 1000000L +#define BAUD_RATE 9600L // 19200 also supported, but with significant error +#elsif F_CPU >= 128000L +#define BAUD_RATE 4800L // Good for 128kHz internal RC +#else +#define BAUD_RATE 1200L // Good even at 32768Hz +#endif +#endif + +#ifndef UART +#define UART 0 +#endif + +#if 0 +/* Switch in soft UART for hard baud rates */ +/* + * I don't understand what this was supposed to accomplish, where the + * constant "280" came from, or why automatically (and perhaps unexpectedly) + * switching to a soft uart is a good thing, so I'm undoing this in favor + * of a range check using the same calc used to config the BRG... + */ +#if (F_CPU/BAUD_RATE) > 280 // > 57600 for 16MHz +#ifndef SOFT_UART +#define SOFT_UART +#endif +#endif +#else // 0 +#if (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 > 250 +#error Unachievable baud rate (too slow) BAUD_RATE +#endif // baud rate slow check +#if (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 < 3 +#error Unachievable baud rate (too fast) BAUD_RATE +#endif // baud rate fastn check +#endif + +/* Watchdog settings */ +#define WATCHDOG_OFF (0) +#define WATCHDOG_16MS (_BV(WDE)) +#define WATCHDOG_32MS (_BV(WDP0) | _BV(WDE)) +#define WATCHDOG_64MS (_BV(WDP1) | _BV(WDE)) +#define WATCHDOG_125MS (_BV(WDP1) | _BV(WDP0) | _BV(WDE)) +#define WATCHDOG_250MS (_BV(WDP2) | _BV(WDE)) +#define WATCHDOG_500MS (_BV(WDP2) | _BV(WDP0) | _BV(WDE)) +#define WATCHDOG_1S (_BV(WDP2) | _BV(WDP1) | _BV(WDE)) +#define WATCHDOG_2S (_BV(WDP2) | _BV(WDP1) | _BV(WDP0) | _BV(WDE)) +#ifndef __AVR_ATmega8__ +#define WATCHDOG_4S (_BV(WDP3) | _BV(WDE)) +#define WATCHDOG_8S (_BV(WDP3) | _BV(WDP0) | _BV(WDE)) +#endif + +/* Function Prototypes */ +/* The main function is in init9, which removes the interrupt vector table */ +/* we don't need. It is also 'naked', which means the compiler does not */ +/* generate any entry or exit code itself. */ +int main(void) __attribute__ ((OS_main)) __attribute__ ((noreturn)) __attribute__ ((section (".init9"))); +void putch(char); +uint8_t getch(void); +static inline void getNch(uint8_t); /* "static inline" is a compiler hint to reduce code size */ +void verifySpace(); +#if LED_START_FLASHES > 0 +static inline void flash_led(uint8_t); +#endif +uint8_t getLen(); +//static inline void watchdogReset(); +void watchdogConfig(uint8_t x); +#ifdef SOFT_UART +void uartDelay() __attribute__ ((naked)); +#endif +static void appStart() ; // __attribute__ ((naked)); + +/* + * NRWW memory + * Addresses below NRWW (Non-Read-While-Write) can be programmed while + * continuing to run code from flash, slightly speeding up programming + * time. Beware that Atmel data sheets specify this as a WORD address, + * while optiboot will be comparing against a 16-bit byte address. This + * means that on a part with 128kB of memory, the upper part of the lower + * 64k will get NRWW processing as well, even though it doesn't need it. + * That's OK. In fact, you can disable the overlapping processing for + * a part entirely by setting NRWWSTART to zero. This reduces code + * space a bit, at the expense of being slightly slower, overall. + * + * RAMSTART should be self-explanatory. It's bigger on parts with a + * lot of peripheral registers. + */ +#if defined(__AVR_ATmega168__) +#define RAMSTART (0x100) +#define NRWWSTART (0x3800) +#elif defined(__AVR_ATmega328P__) +#define RAMSTART (0x100) +#define NRWWSTART (0x7000) +#elif defined(__AVR_ATmega328__) +#define RAMSTART (0x100) +#define NRWWSTART (0x7000) +#elif defined (__AVR_ATmega644P__) +#define RAMSTART (0x100) +#define NRWWSTART (0xE000) +// correct for a bug in avr-libc +#undef SIGNATURE_2 +#define SIGNATURE_2 0x0A +#elif defined (__AVR_ATmega1284P__) +#define RAMSTART (0x100) +#define NRWWSTART (0xE000) +#elif defined(__AVR_ATtiny84__) +#define RAMSTART (0x100) +#define NRWWSTART (0x0000) +#elif defined(__AVR_ATmega1280__) +#define RAMSTART (0x200) +#define NRWWSTART (0xE000) +#elif defined(__AVR_ATmega8__) || defined(__AVR_ATmega88__) +#define RAMSTART (0x100) +#define NRWWSTART (0x1800) +#endif + +/* C zero initialises all global variables. However, that requires */ +/* These definitions are NOT zero initialised, but that doesn't matter */ +/* This allows us to drop the zero init code, saving us memory */ +#define buff ((uint8_t*)(RAMSTART)) +#ifdef VIRTUAL_BOOT_PARTITION +#define rstVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+4)) +#define wdtVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+6)) +#endif + +/* + * Handle devices with up to 4 uarts (eg m1280.) Rather inelegantly. + * Note that mega8 still needs special handling, because ubrr is handled + * differently. + */ +#if UART == 0 +# define UART_SRA UCSR0A +# define UART_SRB UCSR0B +# define UART_SRC UCSR0C +# define UART_SRL UBRR0L +# define UART_UDR UDR0 +#elif UART == 1 +# define UART_SRA UCSR1A +# define UART_SRB UCSR1B +# define UART_SRC UCSR1C +# define UART_SRL UBRR1L +# define UART_UDR UDR1 +#elif UART == 2 +# define UART_SRA UCSR2A +# define UART_SRB UCSR2B +# define UART_SRC UCSR2C +# define UART_SRL UBRR2L +# define UART_UDR UDR2 +#elif UART == 3 +# define UART_SRA UCSR3A +# define UART_SRB UCSR3B +# define UART_SRC UCSR3C +# define UART_SRL UBRR3L +# define UART_UDR UDR3 +#endif + +/* main program starts here */ +int main(void) { + uint8_t ch; + + /* + * Making these local and in registers prevents the need for initializing + * them, and also saves space because code no longer stores to memory. + * (initializing address keeps the compiler happy, but isn't really + * necessary, and uses 4 bytes of flash.) + */ + register uint16_t address = 0; + + // After the zero init loop, this is the first code to run. + // + // This code makes the following assumptions: + // No interrupts will execute + // SP points to RAMEND + // r1 contains zero + // + // If not, uncomment the following instructions: + // cli(); + asm volatile ("clr __zero_reg__"); +#ifdef __AVR_ATmega8__ + SP=RAMEND; // This is done by hardware reset +#endif + + // Adaboot no-wait mod + ch = MCUSR; + MCUSR = 0; + + // Here, if power on, wait 0.5 secs, then check for + // serial Rx signal low, if so, stay in bootloader + // else go to application + + PORTD = 0xFF ; + PORTB = 0x3C ; + PORTC = 1 ; + + if (ch & (_BV(PORF) | (_BV(EXTRF)) ) ) + { +#ifdef MULTI_CALLED +#if F_CPU == 12000000L + TCNT1H = 256 - 8 ; +#else + #if F_CPU == 16000000L + TCNT1H = 256 - 6 ; + #else + TCNT1H = 256 - 127 ; + #endif + TCNT1L = 0 ; + #endif +#else +#if F_CPU == 12000000L + TCNT1 = 65535-5859 ; +#else + #if F_CPU == 16000000L + TCNT1 = 65535-7813 ; + #else + TCNT1 = 65535-32767 ; + #endif +#endif +#endif + + TCCR1B = _BV(CS12) | _BV(CS10); // div 1024 + TIFR1 = _BV(TOV1); + while(!(TIFR1 & _BV(TOV1))) + ; + TCCR1B = 0 ; // Stop timer + uint8_t x ; + x = PINB & 0x3C ; + x |= PINC & 1 ; + if ( x != 0x1D ) + { + appStart() ; // Power on, go to voice application + // if loaded + } + } + +#if LED_START_FLASHES > 0 + // Set up Timer 1 for timeout counter + TCCR1B = _BV(CS12) | _BV(CS10); // div 1024 +#endif + +#ifndef SOFT_UART + UART_SRA = _BV(U2X0); //Double speed mode USART0 + UART_SRB = _BV(RXEN0) | _BV(TXEN0); + UART_SRC = _BV(UCSZ00) | _BV(UCSZ01); +// UART_SRL = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 ); +// Baudrate of 57600 +#if F_CPU == 12000000L + UART_SRL = 25 ; +#else +#if F_CPU == 16000000L + UART_SRL = 33 ; +#else +#ERROR Baud rate not available +#endif +#endif + +#endif + + // Set up watchdog to trigger after 500ms + + +// watchdogConfig(WATCHDOG_1S); + + /* Set LED pin as output */ + LED_DDR |= _BV(LED); + +#ifdef SOFT_UART + /* Set TX pin as output */ + UART_DDR |= _BV(UART_TX_BIT); +#endif + +#if LED_START_FLASHES > 0 + /* Flash onboard LED to signal entering of bootloader */ + flash_led(LED_START_FLASHES * 2); +#endif + + /* Forever loop */ + for (;;) + { + /* get character from UART */ + ch = getch(); + + if(ch == STK_GET_PARAMETER) + { + GPIOR0 = getch(); + verifySpace(); + if (GPIOR0 == 0x82) + { + /* + * Send optiboot version as "minor SW version" + */ + putch(OPTIBOOT_MINVER); + } + else if (GPIOR0 == 0x81) + { + putch(OPTIBOOT_MAJVER); + } + else + { + /* + * GET PARAMETER returns a generic 0x03 reply for + * other parameters - enough to keep Avrdude happy + */ + putch(0x03); + } + } + else if(ch == STK_SET_DEVICE) { + // SET DEVICE is ignored + getNch(20); + } + else if(ch == STK_SET_DEVICE_EXT) + { + // SET DEVICE EXT is ignored + getNch(5); + } + else if(ch == STK_LOAD_ADDRESS) + { + // LOAD ADDRESS + uint16_t newAddress; + newAddress = getch() ; + newAddress = (newAddress & 0xff) | (getch() << 8); +#ifdef RAMPZ + // Transfer top bit to RAMPZ + RAMPZ = (newAddress & 0x8000) ? 1 : 0; +#endif + newAddress += newAddress; // Convert from word address to byte address + address = newAddress; + verifySpace(); + } + else if(ch == STK_UNIVERSAL) + { + // UNIVERSAL command is ignored + getNch(4); + putch(0x00); + } + /* Write memory, length is big endian and is in bytes */ + else if(ch == STK_PROG_PAGE) + { + // PROGRAM PAGE - we support flash programming only, not EEPROM + uint8_t *bufPtr; + uint16_t addrPtr; + register uint8_t length; + + getch(); /* getlen() */ + length = getch(); + getch(); + + // If we are in RWW section, immediately start page erase + if (address < NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address); + + // While that is going on, read in page contents + bufPtr = buff; + do *bufPtr++ = getch(); + while (--length); + + // If we are in NRWW section, page erase has to be delayed until now. + // Todo: Take RAMPZ into account +#ifdef MULTI_CALLED + if (address < 0x7E00) +#endif + { + if (address >= NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address); + } + // Read command terminator, start reply + verifySpace(); + + // If only a partial page is to be programmed, the erase might not be complete. + // So check that here +#ifdef MULTI_CALLED + if (address < 0x7E00) +#endif + { + boot_spm_busy_wait(); + +#ifdef VIRTUAL_BOOT_PARTITION + if ((uint16_t)(void*)address == 0) { + // This is the reset vector page. We need to live-patch the code so the + // bootloader runs. + // + // Move RESET vector to WDT vector + uint16_t vect = buff[0] | (buff[1]<<8); + rstVect = vect; + wdtVect = buff[8] | (buff[9]<<8); + vect -= 4; // Instruction is a relative jump (rjmp), so recalculate. + buff[8] = vect & 0xff; + buff[9] = vect >> 8; + + // Add jump to bootloader at RESET vector + buff[0] = 0x7f; + buff[1] = 0xce; // rjmp 0x1d00 instruction + } +#endif + + // Copy buffer into programming buffer + bufPtr = buff; + addrPtr = (uint16_t)(void*)address; + ch = SPM_PAGESIZE / 2; + do { + uint16_t a; + // a = *bufPtr++; + // a |= (*bufPtr++) << 8; + + a = *((uint16_t *)bufPtr) ; + bufPtr += 2 ; + + __boot_page_fill_short((uint16_t)(void*)addrPtr,a); + addrPtr += 2; + } while (--ch); + + // Write from programming buffer + __boot_page_write_short((uint16_t)(void*)address); + boot_spm_busy_wait(); + +#if defined(RWWSRE) + // Reenable read access to flash + boot_rww_enable(); +#endif + } + } + /* Read memory block mode, length is big endian. */ + else if(ch == STK_READ_PAGE) + { + register uint8_t length; + // READ PAGE - we only read flash + getch(); /* getlen() */ + length = getch(); + getch(); + + verifySpace(); +#ifdef VIRTUAL_BOOT_PARTITION + do { + // Undo vector patch in bottom page so verify passes + if (address == 0) ch=rstVect & 0xff; + else if (address == 1) ch=rstVect >> 8; + else if (address == 8) ch=wdtVect & 0xff; + else if (address == 9) ch=wdtVect >> 8; + else ch = pgm_read_byte_near(address); + address++; + putch(ch); + } while (--length); +#else +#ifdef RAMPZ +// Since RAMPZ should already be set, we need to use EPLM directly. +// do putch(pgm_read_byte_near(address++)); +// while (--length); + do { + uint8_t result; + __asm__ ("elpm %0,Z\n":"=r"(result):"z"(address)); + putch(result); + address++; + } + while (--length); +#else + do putch(pgm_read_byte_near(address++)); + while (--length); +#endif +#endif + } + + /* Get device signature bytes */ + else if(ch == STK_READ_SIGN) + { + // READ SIGN - return what Avrdude wants to hear + verifySpace(); + putch(SIGNATURE_0); + putch(SIGNATURE_1); + putch(SIGNATURE_2); + } + else if (ch == STK_LEAVE_PROGMODE) { /* 'Q' */ + // Adaboot no-wait mod + +// watchdogConfig(WATCHDOG_16MS); + + verifySpace(); +#ifdef MULTI_CALLED + putch(STK_OK); + while (!(UART_SRA & _BV(TXC0))); + appStart() ; +#endif + } + else + { + // This covers the response to commands like STK_ENTER_PROGMODE + verifySpace(); + } + putch(STK_OK); + } +} + +void putch(char ch) { +#ifndef SOFT_UART + while (!(UART_SRA & _BV(UDRE0))); + UART_UDR = ch; +#else + __asm__ __volatile__ ( + " com %[ch]\n" // ones complement, carry set + " sec\n" + "1: brcc 2f\n" + " cbi %[uartPort],%[uartBit]\n" + " rjmp 3f\n" + "2: sbi %[uartPort],%[uartBit]\n" + " nop\n" + "3: rcall uartDelay\n" + " rcall uartDelay\n" + " lsr %[ch]\n" + " dec %[bitcnt]\n" + " brne 1b\n" + : + : + [bitcnt] "d" (10), + [ch] "r" (ch), + [uartPort] "I" (_SFR_IO_ADDR(UART_PORT)), + [uartBit] "I" (UART_TX_BIT) + : + "r25" + ); +#endif +} + +uint8_t getch(void) { + uint8_t ch; + +#ifdef LED_DATA_FLASH +#ifdef __AVR_ATmega8__ + LED_PORT ^= _BV(LED); +#else + LED_PIN |= _BV(LED); +#endif +#endif + +#ifdef SOFT_UART + __asm__ __volatile__ ( + "1: sbic %[uartPin],%[uartBit]\n" // Wait for start edge + " rjmp 1b\n" + " rcall uartDelay\n" // Get to middle of start bit + "2: rcall uartDelay\n" // Wait 1 bit period + " rcall uartDelay\n" // Wait 1 bit period + " clc\n" + " sbic %[uartPin],%[uartBit]\n" + " sec\n" + " dec %[bitCnt]\n" + " breq 3f\n" + " ror %[ch]\n" + " rjmp 2b\n" + "3:\n" + : + [ch] "=r" (ch) + : + [bitCnt] "d" (9), + [uartPin] "I" (_SFR_IO_ADDR(UART_PIN)), + [uartBit] "I" (UART_RX_BIT) + : + "r25" +); +#else + while(!(UART_SRA & _BV(RXC0))) + +// watchdogReset() + + ; +// if (!(UART_SRA & _BV(FE0))) { + /* + * A Framing Error indicates (probably) that something is talking + * to us at the wrong bit rate. Assume that this is because it + * expects to be talking to the application, and DON'T reset the + * watchdog. This should cause the bootloader to abort and run + * the application "soon", if it keeps happening. (Note that we + * don't care that an invalid char is returned...) + */ +// watchdogReset(); +// } + + ch = UART_UDR; +#endif + +#ifdef LED_DATA_FLASH +#ifdef __AVR_ATmega8__ + LED_PORT ^= _BV(LED); +#else + LED_PIN |= _BV(LED); +#endif +#endif + + return ch; +} + +#ifdef SOFT_UART +// AVR305 equation: #define UART_B_VALUE (((F_CPU/BAUD_RATE)-23)/6) +// Adding 3 to numerator simulates nearest rounding for more accurate baud rates +#define UART_B_VALUE (((F_CPU/BAUD_RATE)-20)/6) +#if UART_B_VALUE > 255 +#error Baud rate too slow for soft UART +#endif + +void uartDelay() { + __asm__ __volatile__ ( + "ldi r25,%[count]\n" + "1:dec r25\n" + "brne 1b\n" + "ret\n" + ::[count] "M" (UART_B_VALUE) + ); +} +#endif + +void getNch(uint8_t count) { + do getch(); while (--count); + verifySpace(); +} + +void verifySpace() +{ + if ( getch() != CRC_EOP) { + + putch(STK_NOSYNC); +// watchdogConfig(WATCHDOG_16MS); // shorten WD timeout +// +// while (1) // and busy-loop so that WD causes +// ; // a reset and app start. + } + putch(STK_INSYNC); +} + +#if LED_START_FLASHES > 0 +void flash_led(uint8_t count) { + do { + TCNT1 = -(F_CPU/(1024*16)); + TIFR1 = _BV(TOV1); + while(!(TIFR1 & _BV(TOV1))); +//#ifdef __AVR_ATmega8__ + LED_PORT ^= _BV(LED); +//#else +// LED_PIN |= _BV(LED); +//#endif + watchdogReset(); + } while (--count); +} +#endif + +// Watchdog functions. These are only safe with interrupts turned off. +void watchdogReset() { + __asm__ __volatile__ ( + "wdr\n" + ); +} + +void watchdogConfig(uint8_t x) { + WDTCSR = _BV(WDCE) | _BV(WDE); + WDTCSR = x; +} + +void appStart() +{ +// watchdogConfig(WATCHDOG_OFF); +// __asm__ __volatile__ ( +//#ifdef VIRTUAL_BOOT_PARTITION +// // Jump to WDT vector +// "ldi r30,4\n" +// "clr r31\n" +//#else +// // Jump to RST vector +// "clr r30\n" +// "clr r31\n" +//#endif +// "ijmp\n" +// ); + + register void (*p)() ; + p = 0 ; + + if ( pgm_read_byte( (uint16_t)p ) != 0xFF ) + { + (*p)() ; + } +} + diff --git a/BootLoaders/AtmegaMultiBoot/Source/pin_defs.h b/BootLoaders/AtmegaMultiBoot/Source/pin_defs.h new file mode 100644 index 0000000..9623969 --- /dev/null +++ b/BootLoaders/AtmegaMultiBoot/Source/pin_defs.h @@ -0,0 +1,80 @@ +#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega88) || defined(__AVR_ATmega8__) || defined(__AVR_ATmega88__) +/* Onboard LED is connected to pin PB5 in Arduino NG, Diecimila, and Duemilanove */ +#define LED_DDR DDRB +#define LED_PORT PORTB +#define LED_PIN PINB +#define LED PINB5 + +/* Ports for soft UART */ +#ifdef SOFT_UART +#define UART_PORT PORTD +#define UART_PIN PIND +#define UART_DDR DDRD +#define UART_TX_BIT 1 +#define UART_RX_BIT 0 +#endif +#endif + +#if defined(__AVR_ATmega8__) + //Name conversion R.Wiersma + #define UCSR0A UCSRA + #define UDR0 UDR + #define UDRE0 UDRE + #define RXC0 RXC + #define FE0 FE + #define TIFR1 TIFR + #define WDTCSR WDTCR +#endif + +/* Luminet support */ +#if defined(__AVR_ATtiny84__) +/* Red LED is connected to pin PA4 */ +#define LED_DDR DDRA +#define LED_PORT PORTA +#define LED_PIN PINA +#define LED PINA4 +/* Ports for soft UART - left port only for now. TX/RX on PA2/PA3 */ +#ifdef SOFT_UART +#define UART_PORT PORTA +#define UART_PIN PINA +#define UART_DDR DDRA +#define UART_TX_BIT 2 +#define UART_RX_BIT 3 +#endif +#endif + +/* Sanguino support */ +#if defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__) +/* Onboard LED is connected to pin PB0 on Sanguino */ +#define LED_DDR DDRB +#define LED_PORT PORTB +#define LED_PIN PINB +#define LED PINB0 + +/* Ports for soft UART */ +#ifdef SOFT_UART +#define UART_PORT PORTD +#define UART_PIN PIND +#define UART_DDR DDRD +#define UART_TX_BIT 1 +#define UART_RX_BIT 0 +#endif +#endif + +/* Mega support */ +#if defined(__AVR_ATmega1280__) +/* Onboard LED is connected to pin PB7 on Arduino Mega */ +#define LED_DDR DDRB +#define LED_PORT PORTB +#define LED_PIN PINB +#define LED PINB7 + +/* Ports for soft UART */ +#ifdef SOFT_UART +#define UART_PORT PORTE +#define UART_PIN PINE +#define UART_DDR DDRE +#define UART_TX_BIT 1 +#define UART_RX_BIT 0 +#endif +#endif diff --git a/BootLoaders/AtmegaMultiBoot/Source/stk500.h b/BootLoaders/AtmegaMultiBoot/Source/stk500.h new file mode 100644 index 0000000..ca0dd91 --- /dev/null +++ b/BootLoaders/AtmegaMultiBoot/Source/stk500.h @@ -0,0 +1,39 @@ +/* STK500 constants list, from AVRDUDE */ +#define STK_OK 0x10 +#define STK_FAILED 0x11 // Not used +#define STK_UNKNOWN 0x12 // Not used +#define STK_NODEVICE 0x13 // Not used +#define STK_INSYNC 0x14 // ' ' +#define STK_NOSYNC 0x15 // Not used +#define ADC_CHANNEL_ERROR 0x16 // Not used +#define ADC_MEASURE_OK 0x17 // Not used +#define PWM_CHANNEL_ERROR 0x18 // Not used +#define PWM_ADJUST_OK 0x19 // Not used +#define CRC_EOP 0x20 // 'SPACE' +#define STK_GET_SYNC 0x30 // '0' +#define STK_GET_SIGN_ON 0x31 // '1' +#define STK_SET_PARAMETER 0x40 // '@' +#define STK_GET_PARAMETER 0x41 // 'A' +#define STK_SET_DEVICE 0x42 // 'B' +#define STK_SET_DEVICE_EXT 0x45 // 'E' +#define STK_ENTER_PROGMODE 0x50 // 'P' +#define STK_LEAVE_PROGMODE 0x51 // 'Q' +#define STK_CHIP_ERASE 0x52 // 'R' +#define STK_CHECK_AUTOINC 0x53 // 'S' +#define STK_LOAD_ADDRESS 0x55 // 'U' +#define STK_UNIVERSAL 0x56 // 'V' +#define STK_PROG_FLASH 0x60 // '`' +#define STK_PROG_DATA 0x61 // 'a' +#define STK_PROG_FUSE 0x62 // 'b' +#define STK_PROG_LOCK 0x63 // 'c' +#define STK_PROG_PAGE 0x64 // 'd' +#define STK_PROG_FUSE_EXT 0x65 // 'e' +#define STK_READ_FLASH 0x70 // 'p' +#define STK_READ_DATA 0x71 // 'q' +#define STK_READ_FUSE 0x72 // 'r' +#define STK_READ_LOCK 0x73 // 's' +#define STK_READ_PAGE 0x74 // 't' +#define STK_READ_SIGN 0x75 // 'u' +#define STK_READ_OSCCAL 0x76 // 'v' +#define STK_READ_FUSE_EXT 0x77 // 'w' +#define STK_READ_OSCCAL_EXT 0x78 // 'x' diff --git a/BootLoaders/Boards/boards.txt b/BootLoaders/Boards/boards.txt new file mode 100644 index 0000000..fb3daba --- /dev/null +++ b/BootLoaders/Boards/boards.txt @@ -0,0 +1,41 @@ +# See: https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5---3rd-party-Hardware-specification +# See: http://code.google.com/p/arduino/wiki/Platforms + +############################################################## + +menu.bootloader=Bootloader + +############################################################## +## Multi 4-in-1 (3.3V, 16 MHz) w/ ATmega328p +## -------------------------------------------------- +multiatmega328p.name=Multi 4-in-1 (Atmega328p, 3.3V, 16MHz) + +multiatmega328p.upload.tool=arduino:avrdude +multiatmega328p.upload.protocol=arduino +multiatmega328p.upload.speed=57600 +multiatmega328p.upload.maximum_data_size=2048 + +multiatmega328p.build.mcu=atmega328p +multiatmega328p.build.f_cpu=16000000L +multiatmega328p.build.board=AVR_PRO +multiatmega328p.build.core=arduino:arduino +multiatmega328p.build.variant=arduino:eightanaloginputs +multiatmega328p.build.extra_flags=-Wl,--relax + +multiatmega328p.bootloader.tool=arduino:avrdude +multiatmega328p.bootloader.low_fuses=0xFF +multiatmega328p.bootloader.extended_fuses=0xFD +multiatmega328p.bootloader.unlock_bits=0x3F +multiatmega328p.bootloader.lock_bits=0x0F + +multiatmega328p.menu.bootloader.none=No bootloader +multiatmega328p.menu.bootloader.none.upload.maximum_size=32768 +multiatmega328p.menu.bootloader.none.bootloader.file=Multi4in1/AtmegaMultiEmpty.hex +multiatmega328p.menu.bootloader.none.bootloader.high_fuses=0xD7 + +multiatmega328p.menu.bootloader.optiboot=Flash from TX +multiatmega328p.menu.bootloader.optiboot.upload.maximum_size=32512 +multiatmega328p.menu.bootloader.optiboot.bootloader.file=Multi4in1/AtmegaMultiBoot.hex +multiatmega328p.menu.bootloader.optiboot.bootloader.high_fuses=0xD6 + +############################################################## diff --git a/BootLoaders/Boards/bootloaders/Multi4in1/AtmegaMultiBoot.hex b/BootLoaders/Boards/bootloaders/Multi4in1/AtmegaMultiBoot.hex new file mode 100644 index 0000000..b21d654 --- /dev/null +++ b/BootLoaders/Boards/bootloaders/Multi4in1/AtmegaMultiBoot.hex @@ -0,0 +1,34 @@ +:107E0000112484B714BE9FEF9BB99CE395B991E010 +:107E100098B98370A9F08AEF80938500109284004E +:107E200085E08093810096BBB09BFECF10928100CD +:107E300093B186B181709C73892B8D3109F0B3D0D9 +:107E400082E08093C00088E18093C10086E0809347 +:107E5000C20081E28093C400259AC0E0D0E093E0A4 +:107E6000F92EEE24E39425E0D22E31E1C32EA9D0E1 +:107E7000813481F4A6D08EBBABD08EB3823811F49E +:107E800085E006C08EB3813811F484E001C083E040 +:107E900091D086C0823411F484E103C0853419F492 +:107EA00085E09DD07DC0853541F48BD0C82F89D029 +:107EB000D0E0D82BCC0FDD1F72C0863521F484E0D2 +:107EC0008ED080E0E5CF843609F03DC07AD079D0FD +:107ED000B82E77D0C11520E7D20718F000E011E0E6 +:107EE00004C0FE01F7BEE895F9CF6BD0F80181938D +:107EF0008F01BE12FACFCE01905781159E4018F423 +:107F0000FE01F7BEE89564D0C115FEE7DF0708F073 +:107F100047C007B600FCFDCFFE01A0E0B1E08D91A7 +:107F20009D910C01E7BEE89511243296A03821E01E +:107F3000B207A9F7FE01D7BEE89507B600FCFDCF52 +:107F4000C7BEE8952DC08437B1F43BD03AD0B82EE7 +:107F500038D03ED0FE01AC2EAB0C8F010F5F1F4F0F +:107F6000849128D0A01205C02196BA94CB0DD11DC2 +:107F700017C0F801F2CF853739F42AD08EE11AD034 +:107F800085E918D08FE084CF813549F421D080E194 +:107F900011D08091C00086FFFCCF05D001C018D061 +:107FA00080E108D064CFE0E0F0E084918F3F09F0F9 +:107FB000099408959091C00095FFFCCF8093C6006E +:107FC00008958091C00087FFFCCF8091C60008957E +:107FD000F8DF803211F085E1EDDF84E1EBCFCF9364 +:107FE000C82FEFDFC150E9F7CF91F2CFA8950895E0 +:0C7FF000E0E6F0E098E1908380830895C3 +:0400000300007E007B +:00000001FF diff --git a/BootLoaders/Boards/bootloaders/Multi4in1/AtmegaMultiEmpty.hex b/BootLoaders/Boards/bootloaders/Multi4in1/AtmegaMultiEmpty.hex new file mode 100644 index 0000000..23e6738 --- /dev/null +++ b/BootLoaders/Boards/bootloaders/Multi4in1/AtmegaMultiEmpty.hex @@ -0,0 +1,2 @@ +:02000000FFFF00 +:00000001FF diff --git a/BootLoaders/Boards/platform.local.txt b/BootLoaders/Boards/platform.local.txt new file mode 100644 index 0000000..b7db254 --- /dev/null +++ b/BootLoaders/Boards/platform.local.txt @@ -0,0 +1 @@ +# Empty diff --git a/BootLoaders/Boards/platform.txt b/BootLoaders/Boards/platform.txt new file mode 100644 index 0000000..e41c5cc --- /dev/null +++ b/BootLoaders/Boards/platform.txt @@ -0,0 +1,9 @@ + +# Arduino AVR Core and platform. +# ------------------------------ + +# For more info: +# https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5---3rd-party-Hardware-specification + +name=Multi 4-in-1 Boards +version=1.0.0 diff --git a/BootLoaders/OrangeMultiBoot/OrangeMultiBoot.hex b/BootLoaders/OrangeMultiBoot/OrangeMultiBoot.hex new file mode 100644 index 0000000..1d7eb24 --- /dev/null +++ b/BootLoaders/OrangeMultiBoot/OrangeMultiBoot.hex @@ -0,0 +1,47 @@ +:108000001F92CDB7DEB7CFD01124809178009FEFBB +:1080100090937800837099F088EA91E680936808DD +:108020009093690880E180934C0880914C0884FF0C +:10803000FCCF109240088091680682FD8FD082E0CC +:1080400080936106C12CD12C97D0813479F494D0DF +:10805000898399D08981823811F485E005C08138FF +:1080600011F484E001C083E080D075C0823411F443 +:1080700084E103C0853419F485E08CD06CC085356B +:1080800059F47AD0C82E78D0D12CD82A8D2D881FBB +:108090008827881F8BBF5EC0863521F484E07AD0A4 +:1080A00080E0E2CF843641F567D066D0F82E64D008 +:1080B000C601DCD000E010E25FD0F80181938F01AF +:1080C000FE12FACF60D0D7FC46C0CBD0C601DAD0C2 +:1080D000760100E010E2F801619171918F01C70112 +:1080E000DBD0F2E0EF0EF11C011581E2180799F7E1 +:1080F000C601E0D0B6D02FC08437C1F43DD03CD00B +:10810000F82E3AD040D0F601EC2CEF0C8F010F5F27 +:108110001F4F84912AD0E01207C0EFEFCE1ADE0A7B +:10812000FA94CF0CD11C17C0F801F0CF853739F481 +:108130002AD08EE11AD085E918D082E495CF813516 +:1081400049F421D080E111D08091A10886FFFCCFB5 +:1081500005D001C018D080E108D076CFE0E0F0E093 +:1081600084918F3F09F0099408959091A10895FF9B +:10817000FCCF8093A00808958091A10887FFFCCFD1 +:108180008091A0080895F8DF803211F085E1EDDFDD +:1081900084E1EBCFCF93C82FEFDFC150E9F7CF9148 +:1081A000F2CFA895089583EC8093520080915000FF +:1081B0008860809350008091510083FFFCCF82EC57 +:1081C0008093550080915000806180935000809191 +:1081D000510084FFFCCF88ED84BF1092400084BF23 +:1081E00024E02093400087E08093A20087E88093FA +:1081F0008301109241081092420810924308109295 +:10820000440810924608109247088FEF9FEF809322 +:1082100066089093670810926008109261088BE0DE +:1082200080934008209365062093620688E180933E +:10823000720698E0909345069093410692E29093DF +:10824000A6081092A7088093A4088091A3088F7CA9 +:1082500080618093A30883E08093A5088091A008A3 +:1082600008958091CF0187FDFCCF08958F939F9350 +:1082700082E2E0ECF1E08287FF91EF918DE984BF2B +:10828000E8950895FC0186E28093CA0188ED84BFD9 +:1082900081E08093CB0108950F921F92FC01062E7E +:1082A000172E83E28093CA018DE984BFE8951F9061 +:1082B0000F900895FC018EE28093CA018DE984BF7E +:0482C000E8950895A0 +:040000030000800079 +:00000001FF diff --git a/BootLoaders/OrangeMultiBoot/Source/Makefile b/BootLoaders/OrangeMultiBoot/Source/Makefile new file mode 100644 index 0000000..0797343 --- /dev/null +++ b/BootLoaders/OrangeMultiBoot/Source/Makefile @@ -0,0 +1,503 @@ +# Makefile for ATmegaBOOT +# E.Lins, 18.7.2005 +# $Id$ +# +# Instructions +# +# To make bootloader .hex file: +# make diecimila +# make lilypad +# make ng +# etc... +# +# To burn bootloader .hex file: +# make diecimila_isp +# make lilypad_isp +# make ng_isp +# etc... + +# program name should not be changed... +PROGRAM = optiboot + +# The default behavior is to build using tools that are in the users +# current path variables, but we can also build using an installed +# Arduino user IDE setup, or the Arduino source tree. +# Uncomment this next lines to build within the arduino environment, +# using the arduino-included avrgcc toolset (mac and pc) +# ENV ?= arduino +# ENV ?= arduinodev +# OS ?= macosx +# OS ?= windows + + +# enter the parameters for the avrdude isp tool -b19200 +# +# These are the parameters for a usb-based STK500v2 programmer. +# Exact type unknown. (historical Makefile values.) +ISPTOOL = stk500v2 +ISPPORT = usb +ISPSPEED = -b 57600 +# +# +# These are parameters for using an Arduino with the ArduinoISP sketch +# as the programmer. On a mac, for a particular Uno as programmer. +#ISPTOOL = stk500v1 -C /Applications/arduino/arduino-0022/hardware/tools/avr/etc/avrdude.conf +#ISPPORT = /dev/tty.usbmodemfd3141 +#ISPSPEED = -b19200 + +MCU_TARGET = atmega168 +LDSECTIONS = -Wl,--section-start=.text=0x3e00 -Wl,--section-start=.version=0x3ffe + +# Build environments +# Start of some ugly makefile-isms to allow optiboot to be built +# in several different environments. See the README.TXT file for +# details. + +# default +fixpath = $(1) + +ifeq ($(ENV), arduino) +# For Arduino, we assume that we're connected to the optiboot directory +# included with the arduino distribution, which means that the full set +# of avr-tools are "right up there" in standard places. +TOOLROOT = ../../../tools +GCCROOT = $(TOOLROOT)/avr/bin/ +AVRDUDE_CONF = -C$(TOOLROOT)/avr/etc/avrdude.conf + +ifeq ($(OS), windows) +# On windows, SOME of the tool paths will need to have backslashes instead +# of forward slashes (because they use windows cmd.exe for execution instead +# of a unix/mingw shell?) We also have to ensure that a consistent shell +# is used even if a unix shell is installed (ie as part of WINAVR) +fixpath = $(subst /,\,$1) +SHELL = cmd.exe +endif + +else ifeq ($(ENV), arduinodev) +# Arduino IDE source code environment. Use the unpacked compilers created +# by the build (you'll need to do "ant build" first.) +ifeq ($(OS), macosx) +TOOLROOT = ../../../../build/macosx/work/Arduino.app/Contents/Resources/Java/hardware/tools +endif +ifeq ($(OS), windows) +TOOLROOT = ../../../../build/windows/work/hardware/tools +endif + +GCCROOT = $(TOOLROOT)/avr/bin/ +AVRDUDE_CONF = -C$(TOOLROOT)/avr/etc/avrdude.conf + +else +GCCROOT = +AVRDUDE_CONF = +endif +# +# End of build environment code. + + +# the efuse should really be 0xf8; since, however, only the lower +# three bits of that byte are used on the atmega168, avrdude gets +# confused if you specify 1's for the higher bits, see: +# http://tinker.it/now/2007/02/24/the-tale-of-avrdude-atmega168-and-extended-bits-fuses/ +# +# similarly, the lock bits should be 0xff instead of 0x3f (to +# unlock the bootloader section) and 0xcf instead of 0x2f (to +# lock it), but since the high two bits of the lock byte are +# unused, avrdude would get confused. + +ISPFUSES = $(GCCROOT)avrdude $(AVRDUDE_CONF) -c $(ISPTOOL) \ + -p $(MCU_TARGET) -P $(ISPPORT) $(ISPSPEED) \ + -e -u -U lock:w:0x3f:m -U efuse:w:0x$(EFUSE):m \ + -U hfuse:w:0x$(HFUSE):m -U lfuse:w:0x$(LFUSE):m +ISPFLASH = $(GCCROOT)avrdude $(AVRDUDE_CONF) -c $(ISPTOOL) \ + -p $(MCU_TARGET) -P $(ISPPORT) $(ISPSPEED) \ + -U flash:w:$(PROGRAM)_$(TARGET).hex -U lock:w:0x2f:m + +STK500 = "C:\Program Files\Atmel\AVR Tools\STK500\Stk500.exe" +STK500-1 = $(STK500) -e -d$(MCU_TARGET) -pf -vf -if$(PROGRAM)_$(TARGET).hex \ +-lFF -LFF -f$(HFUSE)$(LFUSE) -EF8 -ms -q -cUSB -I200kHz -s -wt +STK500-2 = $(STK500) -d$(MCU_TARGET) -ms -q -lCF -LCF -cUSB -I200kHz -s -wt + +OBJ = $(PROGRAM).o +OPTIMIZE = -Os -fno-inline-small-functions -fno-split-wide-types +# -mshort-calls + +DEFS = +LIBS = + +CC = $(GCCROOT)avr-gcc + +# Override is only needed by avr-lib build system. + +override CFLAGS = -g -Wall $(OPTIMIZE) -mmcu=$(MCU_TARGET) -DF_CPU=$(AVR_FREQ) $(DEFS) +override LDFLAGS = $(LDSECTIONS) -Wl,--relax -Wl,--gc-sections -nostartfiles -nostdlib + +OBJCOPY = $(GCCROOT)avr-objcopy +OBJDUMP = $(call fixpath,$(GCCROOT)avr-objdump) + +SIZE = $(GCCROOT)avr-size + + + +#Voice board test +# ATmega328 +# +#atmega328: TARGET = atmega328p +#atmega328: MCU_TARGET = atmega328p +#atmega328: CFLAGS += '-DLED_START_FLASHES=0' '-DBAUD_RATE=38400' +#atmega328: AVR_FREQ = 12000000L +#atmega328: LDSECTIONS = -Wl,--section-start=.text=0x7e00 -Wl,--section-start=.version=0x7ffe +#atmega328: $(PROGRAM)_atmega328.hex +#atmega328: $(PROGRAM)_atmega328.lst + +xmega32D4: TARGET = atxmega32d4 +xmega32D4: MCU_TARGET = atxmega32d4 +xmega32D4: CFLAGS += '-DLED_START_FLASHES=0' '-DBAUD_RATE=57600' +xmega32D4: AVR_FREQ = 32000000L +xmega32D4: LDSECTIONS = -Wl,--section-start=.text=0x8000 +xmega32D4: $(PROGRAM)_xmega32d4.hex +xmega32D4: $(PROGRAM)_xmega32d4.lst + +atmega328: TARGET = atmega328 +atmega328: MCU_TARGET = atmega328p +atmega328: CFLAGS += '-DLED_START_FLASHES=0' '-DBAUD_RATE=57600' +atmega328: AVR_FREQ = 16000000L +atmega328: LDSECTIONS = -Wl,--section-start=.text=0x7e00 -Wl,--section-start=.version=0x7ffe +atmega328: $(PROGRAM)_atmega328_16.hex +atmega328: $(PROGRAM)_atmega328_16.lst + + +# Test platforms +# Virtual boot block test +virboot328: TARGET = atmega328 +virboot328: MCU_TARGET = atmega328p +virboot328: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=38400' '-DVIRTUAL_BOOT' +virboot328: AVR_FREQ = 16000000L +virboot328: LDSECTIONS = -Wl,--section-start=.text=0x7e00 -Wl,--section-start=.version=0x7ffe +virboot328: $(PROGRAM)_atmega328.hex +virboot328: $(PROGRAM)_atmega328.lst + +# 20MHz clocked platforms +# +# These are capable of 230400 baud, or 38400 baud on PC (Arduino Avrdude issue) +# + +pro20: TARGET = pro_20mhz +pro20: MCU_TARGET = atmega168 +pro20: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=38400' +pro20: AVR_FREQ = 20000000L +pro20: $(PROGRAM)_pro_20mhz.hex +pro20: $(PROGRAM)_pro_20mhz.lst + +pro20_isp: pro20 +pro20_isp: TARGET = pro_20mhz +# 2.7V brownout +pro20_isp: HFUSE = DD +# Full swing xtal (20MHz) 258CK/14CK+4.1ms +pro20_isp: LFUSE = C6 +# 512 byte boot +pro20_isp: EFUSE = 04 +pro20_isp: isp + +# 16MHz clocked platforms +# +# These are capable of 230400 baud, or 38400 baud on PC (Arduino Avrdude issue) +# + +pro16: TARGET = pro_16MHz +pro16: MCU_TARGET = atmega168 +pro16: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=38400' +pro16: AVR_FREQ = 16000000L +pro16: $(PROGRAM)_pro_16MHz.hex +pro16: $(PROGRAM)_pro_16MHz.lst + +pro16_isp: pro16 +pro16_isp: TARGET = pro_16MHz +# 2.7V brownout +pro16_isp: HFUSE = DD +# Full swing xtal (20MHz) 258CK/14CK+4.1ms +pro16_isp: LFUSE = C6 +# 512 byte boot +pro16_isp: EFUSE = 04 +pro16_isp: isp + +# Diecimila, Duemilanove with m168, and NG use identical bootloaders +# Call it "atmega168" for generality and clarity, keep "diecimila" for +# backward compatibility of makefile +# +atmega168: TARGET = atmega168 +atmega168: MCU_TARGET = atmega168 +atmega168: CFLAGS += '-DLED_START_FLASHES=0' '-DBAUD_RATE=38400' +atmega168: AVR_FREQ = 12000000L +atmega168: $(PROGRAM)_atmega168.hex +atmega168: $(PROGRAM)_atmega168.lst + +atmega168_isp: atmega168 +atmega168_isp: TARGET = atmega168 +# 2.7V brownout +atmega168_isp: HFUSE = DD +# Low power xtal (16MHz) 16KCK/14CK+65ms +atmega168_isp: LFUSE = FF +# 512 byte boot +atmega168_isp: EFUSE = 04 +atmega168_isp: isp + +diecimila: TARGET = diecimila +diecimila: MCU_TARGET = atmega168 +diecimila: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=38400' +diecimila: AVR_FREQ = 16000000L +diecimila: $(PROGRAM)_diecimila.hex +diecimila: $(PROGRAM)_diecimila.lst + +diecimila_isp: diecimila +diecimila_isp: TARGET = diecimila +# 2.7V brownout +diecimila_isp: HFUSE = DD +# Low power xtal (16MHz) 16KCK/14CK+65ms +diecimila_isp: LFUSE = FF +# 512 byte boot +diecimila_isp: EFUSE = 04 +diecimila_isp: isp + +atmega328_isp: atmega328 +atmega328_isp: TARGET = atmega328 +atmega328_isp: MCU_TARGET = atmega328p +# 512 byte boot, SPIEN +atmega328_isp: HFUSE = DE +# Low power xtal (16MHz) 16KCK/14CK+65ms +atmega328_isp: LFUSE = FF +# 2.7V brownout +atmega328_isp: EFUSE = FD +atmega328_isp: isp + +atmega1284: TARGET = atmega1284p +atmega1284: MCU_TARGET = atmega1284p +atmega1284: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=38400' '-DBIGBOOT' +atmega1284: AVR_FREQ = 16000000L +atmega1284: LDSECTIONS = -Wl,--section-start=.text=0x1fc00 -Wl,--section-start=.version=0x1fffe +atmega1284: $(PROGRAM)_atmega1284p.hex +atmega1284: $(PROGRAM)_atmega1284p.lst + +atmega1284_isp: atmega1284 +atmega1284_isp: TARGET = atmega1284p +atmega1284_isp: MCU_TARGET = atmega1284p +# 1024 byte boot +atmega1284_isp: HFUSE = DE +# Low power xtal (16MHz) 16KCK/14CK+65ms +atmega1284_isp: LFUSE = FF +# 2.7V brownout +atmega1284_isp: EFUSE = FD +atmega1284_isp: isp + +# Sanguino has a minimum boot size of 1024 bytes, so enable extra functions +# +sanguino: TARGET = atmega644p +sanguino: MCU_TARGET = atmega644p +sanguino: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=38400' '-DBIGBOOT' +sanguino: AVR_FREQ = 16000000L +sanguino: LDSECTIONS = -Wl,--section-start=.text=0xfc00 -Wl,--section-start=.version=0xfffe +sanguino: $(PROGRAM)_atmega644p.hex +sanguino: $(PROGRAM)_atmega644p.lst + +sanguino_isp: sanguino +sanguino_isp: TARGET = atmega644p +sanguino_isp: MCU_TARGET = atmega644p +# 1024 byte boot +sanguino_isp: HFUSE = DE +# Low power xtal (16MHz) 16KCK/14CK+65ms +sanguino_isp: LFUSE = FF +# 2.7V brownout +sanguino_isp: EFUSE = FD +sanguino_isp: isp + +# Mega has a minimum boot size of 1024 bytes, so enable extra functions +#mega: TARGET = atmega1280 +mega1280: MCU_TARGET = atmega1280 +mega1280: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=38400' '-DBIGBOOT' +mega1280: AVR_FREQ = 16000000L +mega1280: LDSECTIONS = -Wl,--section-start=.text=0x1fc00 -Wl,--section-start=.version=0x1fffe +mega1280: $(PROGRAM)_atmega1280.hex +mega1280: $(PROGRAM)_atmega1280.lst + +mega1280_isp: mega +mega1280_isp: TARGET = atmega1280 +mega1280_isp: MCU_TARGET = atmega1280 +# 1024 byte boot +mega1280_isp: HFUSE = DE +# Low power xtal (16MHz) 16KCK/14CK+65ms +mega1280_isp: LFUSE = FF +# 2.7V brownout +mega1280_isp: EFUSE = FD +mega1280_isp: isp + +# ATmega8 +# +atmega8: TARGET = atmega8 +atmega8: MCU_TARGET = atmega8 +atmega8: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=38400' +atmega8: AVR_FREQ = 16000000L +atmega8: LDSECTIONS = -Wl,--section-start=.text=0x1e00 -Wl,--section-start=.version=0x1ffe +atmega8: $(PROGRAM)_atmega8.hex +atmega8: $(PROGRAM)_atmega8.lst + +atmega8_isp: atmega8 +atmega8_isp: TARGET = atmega8 +atmega8_isp: MCU_TARGET = atmega8 +# SPIEN, CKOPT, Bootsize=512B +atmega8_isp: HFUSE = CC +# 2.7V brownout, Low power xtal (16MHz) 16KCK/14CK+65ms +atmega8_isp: LFUSE = BF +atmega8_isp: isp + +# ATmega88 +# +atmega88: TARGET = atmega88 +atmega88: MCU_TARGET = atmega88 +atmega88: CFLAGS += '-DLED_START_FLASHES=0' '-DBAUD_RATE=38400' +atmega88: AVR_FREQ = 12000000L +atmega88: LDSECTIONS = -Wl,--section-start=.text=0x1e00 -Wl,--section-start=.version=0x1ffe +atmega88: $(PROGRAM)_atmega88.hex +atmega88: $(PROGRAM)_atmega88.lst + +atmega88_isp: atmega88 +atmega88_isp: TARGET = atmega88 +atmega88_isp: MCU_TARGET = atmega88 +# 2.7V brownout +atmega88_isp: HFUSE = DD +# Low power xtal (16MHz) 16KCK/14CK+65ms +atemga88_isp: LFUSE = FF +# 512 byte boot +atmega88_isp: EFUSE = 04 +atmega88_isp: isp + + +# 8MHz clocked platforms +# +# These are capable of 38400 baud +# + +lilypad: TARGET = lilypad +lilypad: MCU_TARGET = atmega168 +lilypad: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=38400' +lilypad: AVR_FREQ = 8000000L +lilypad: $(PROGRAM)_lilypad.hex +lilypad: $(PROGRAM)_lilypad.lst + +lilypad_isp: lilypad +lilypad_isp: TARGET = lilypad +# 2.7V brownout +lilypad_isp: HFUSE = DD +# Internal 8MHz osc (8MHz) Slow rising power +lilypad_isp: LFUSE = E2 +# 512 byte boot +lilypad_isp: EFUSE = 04 +lilypad_isp: isp + +lilypad_resonator: TARGET = lilypad_resonator +lilypad_resonator: MCU_TARGET = atmega168 +lilypad_resonator: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=38400' +lilypad_resonator: AVR_FREQ = 8000000L +lilypad_resonator: $(PROGRAM)_lilypad_resonator.hex +lilypad_resonator: $(PROGRAM)_lilypad_resonator.lst + +lilypad_resonator_isp: lilypad_resonator +lilypad_resonator_isp: TARGET = lilypad_resonator +# 2.7V brownout +lilypad_resonator_isp: HFUSE = DD +# Full swing xtal (20MHz) 258CK/14CK+4.1ms +lilypad_resonator_isp: LFUSE = C6 +# 512 byte boot +lilypad_resonator_isp: EFUSE = 04 +lilypad_resonator_isp: isp + +pro8: TARGET = pro_8MHz +pro8: MCU_TARGET = atmega168 +pro8: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=38400' +pro8: AVR_FREQ = 8000000L +pro8: $(PROGRAM)_pro_8MHz.hex +pro8: $(PROGRAM)_pro_8MHz.lst + +pro8_isp: pro8 +pro8_isp: TARGET = pro_8MHz +# 2.7V brownout +pro8_isp: HFUSE = DD +# Full swing xtal (20MHz) 258CK/14CK+4.1ms +pro8_isp: LFUSE = C6 +# 512 byte boot +pro8_isp: EFUSE = 04 +pro8_isp: isp + +atmega328_pro8: TARGET = atmega328_pro_8MHz +atmega328_pro8: MCU_TARGET = atmega328p +atmega328_pro8: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=38400' +atmega328_pro8: AVR_FREQ = 8000000L +atmega328_pro8: LDSECTIONS = -Wl,--section-start=.text=0x7e00 -Wl,--section-start=.version=0x7ffe +atmega328_pro8: $(PROGRAM)_atmega328_pro_8MHz.hex +atmega328_pro8: $(PROGRAM)_atmega328_pro_8MHz.lst + +atmega328_pro8_isp: atmega328_pro8 +atmega328_pro8_isp: TARGET = atmega328_pro_8MHz +atmega328_pro8_isp: MCU_TARGET = atmega328p +# 512 byte boot, SPIEN +atmega328_pro8_isp: HFUSE = DE +# Low power xtal (16MHz) 16KCK/14CK+65ms +atmega328_pro8_isp: LFUSE = FF +# 2.7V brownout +atmega328_pro8_isp: EFUSE = DE +atmega328_pro8_isp: isp + +# 1MHz clocked platforms +# +# These are capable of 9600 baud +# + +luminet: TARGET = luminet +luminet: MCU_TARGET = attiny84 +luminet: CFLAGS += '-DLED_START_FLASHES=3' '-DSOFT_UART' '-DBAUD_RATE=9600' +luminet: CFLAGS += '-DVIRTUAL_BOOT_PARTITION' +luminet: AVR_FREQ = 1000000L +luminet: LDSECTIONS = -Wl,--section-start=.text=0x1d00 -Wl,--section-start=.version=0x1efe +luminet: $(PROGRAM)_luminet.hex +luminet: $(PROGRAM)_luminet.lst + +luminet_isp: luminet +luminet_isp: TARGET = luminet +luminet_isp: MCU_TARGET = attiny84 +# Brownout disabled +luminet_isp: HFUSE = DF +# 1MHz internal oscillator, slowly rising power +luminet_isp: LFUSE = 62 +# Self-programming enable +luminet_isp: EFUSE = FE +luminet_isp: isp + +# +# Generic build instructions +# +# + +isp: $(TARGET) + $(ISPFUSES) + $(ISPFLASH) + +isp-stk500: $(PROGRAM)_$(TARGET).hex + $(STK500-1) + $(STK500-2) + +%.elf: $(OBJ) + $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS) + $(SIZE) $@ + +clean: + rm -rf *.o *.elf *.lst *.map *.sym *.lss *.eep *.srec *.bin *.hex + +%.lst: %.elf + $(OBJDUMP) -h -S $< > $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -j .version --set-section-flags .version=alloc,load -O ihex $< $@ + +%.srec: %.elf + $(OBJCOPY) -j .text -j .data -j .version --set-section-flags .version=alloc,load -O srec $< $@ + +%.bin: %.elf + $(OBJCOPY) -j .text -j .data -j .version --set-section-flags .version=alloc,load -O binary $< $@ diff --git a/BootLoaders/OrangeMultiBoot/Source/optiboot.c b/BootLoaders/OrangeMultiBoot/Source/optiboot.c new file mode 100644 index 0000000..5a7985f --- /dev/null +++ b/BootLoaders/OrangeMultiBoot/Source/optiboot.c @@ -0,0 +1,980 @@ +/**********************************************************/ +/* Optiboot bootloader for Xmega */ +/* */ +/* http://optiboot.googlecode.com */ +/* */ +/* Arduino-maintained version : See README.TXT */ +/* http://code.google.com/p/arduino/ */ +/* It is the intent that changes not relevant to the */ +/* Arduino production envionment get moved from the */ +/* optiboot project to the arduino project in "lumps." */ +/* */ +/* Heavily optimised bootloader that is faster and */ +/* smaller than the Arduino standard bootloader */ +/* */ +/* Enhancements: */ +/* Fits in 512 bytes, saving 1.5K of code space */ +/* Background page erasing speeds up programming */ +/* Higher baud rate speeds up programming */ +/* Written almost entirely in C */ +/* Customisable timeout with accurate timeconstant */ +/* Optional virtual UART. No hardware UART required. */ +/* Optional virtual boot partition for devices without. */ +/* */ +/* What you lose: */ +/* Implements a skeleton STK500 protocol which is */ +/* missing several features including EEPROM */ +/* programming and non-page-aligned writes */ +/* High baud rate breaks compatibility with standard */ +/* Arduino flash settings */ +/* */ +/* Fully supported: */ +/* ATmega168 based devices (Diecimila etc) */ +/* ATmega328P based devices (Duemilanove etc) */ +/* */ +/* Beta test (believed working.) */ +/* ATmega8 based devices (Arduino legacy) */ +/* ATmega328 non-picopower devices */ +/* ATmega644P based devices (Sanguino) */ +/* ATmega1284P based devices */ +/* */ +/* Alpha test */ +/* ATmega1280 based devices (Arduino Mega) */ +/* */ +/* Work in progress: */ +/* ATtiny84 based devices (Luminet) */ +/* */ +/* Does not support: */ +/* USB based devices (eg. Teensy) */ +/* */ +/* Assumptions: */ +/* The code makes several assumptions that reduce the */ +/* code size. They are all true after a hardware reset, */ +/* but may not be true if the bootloader is called by */ +/* other means or on other hardware. */ +/* No interrupts can occur */ +/* UART and Timer 1 are set to their reset state */ +/* SP points to RAMEND */ +/* */ +/* Code builds on code, libraries and optimisations from: */ +/* stk500boot.c by Jason P. Kyle */ +/* Arduino bootloader http://arduino.cc */ +/* Spiff's 1K bootloader http://spiffie.org/know/arduino_1k_bootloader/bootloader.shtml */ +/* avr-libc project http://nongnu.org/avr-libc */ +/* Adaboot http://www.ladyada.net/library/arduino/bootloader.html */ +/* AVR305 Atmel Application Note */ +/* */ +/* This program is free software; you can redistribute it */ +/* and/or modify it under the terms of the GNU General */ +/* Public License as published by the Free Software */ +/* Foundation; either version 2 of the License, or */ +/* (at your option) any later version. */ +/* */ +/* This program is distributed in the hope that it will */ +/* be useful, but WITHOUT ANY WARRANTY; without even the */ +/* implied warranty of MERCHANTABILITY or FITNESS FOR A */ +/* PARTICULAR PURPOSE. See the GNU General Public */ +/* License for more details. */ +/* */ +/* You should have received a copy of the GNU General */ +/* Public License along with this program; if not, write */ +/* to the Free Software Foundation, Inc., */ +/* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +/* */ +/* Licence can be viewed at */ +/* http://www.fsf.org/licenses/gpl.txt */ +/* */ +/**********************************************************/ + + +/**********************************************************/ +/* */ +/* Optional defines: */ +/* */ +/**********************************************************/ +/* */ +/* BIG_BOOT: */ +/* Build a 1k bootloader, not 512 bytes. This turns on */ +/* extra functionality. */ +/* */ +/* BAUD_RATE: */ +/* Set bootloader baud rate. */ +/* */ +/* LUDICROUS_SPEED: */ +/* 230400 baud :-) */ +/* */ +/* SOFT_UART: */ +/* Use AVR305 soft-UART instead of hardware UART. */ +/* */ +/* LED_START_FLASHES: */ +/* Number of LED flashes on bootup. */ +/* */ +/* LED_DATA_FLASH: */ +/* Flash LED when transferring data. For boards without */ +/* TX or RX LEDs, or for people who like blinky lights. */ +/* */ +/* SUPPORT_EEPROM: */ +/* Support reading and writing from EEPROM. This is not */ +/* used by Arduino, so off by default. */ +/* */ +/* TIMEOUT_MS: */ +/* Bootloader timeout period, in milliseconds. */ +/* 500,1000,2000,4000,8000 supported. */ +/* */ +/* UART: */ +/* UART number (0..n) for devices with more than */ +/* one hardware uart (644P, 1284P, etc) */ +/* */ +/**********************************************************/ + +/**********************************************************/ +/* Version Numbers! */ +/* */ +/* Arduino Optiboot now includes this Version number in */ +/* the source and object code. */ +/* */ +/* Version 3 was released as zip from the optiboot */ +/* repository and was distributed with Arduino 0022. */ +/* Version 4 starts with the arduino repository commit */ +/* that brought the arduino repository up-to-date with */ +/* the optiboot source tree changes since v3. */ +/* */ +/**********************************************************/ + +/**********************************************************/ +/* Edit History: */ +/* */ +/* Nov 2012 */ +/* Specific version for 9x voice module */ +/* by Mike Blandford */ +/* Mar 2012 */ +/* 4.5 WestfW: add infrastructure for non-zero UARTS. */ +/* 4.5 WestfW: fix SIGNATURE_2 for m644 (bad in avr-libc) */ +/* Jan 2012: */ +/* 4.5 WestfW: fix NRWW value for m1284. */ +/* 4.4 WestfW: use attribute OS_main instead of naked for */ +/* main(). This allows optimizations that we */ +/* count on, which are prohibited in naked */ +/* functions due to PR42240. (keeps us less */ +/* than 512 bytes when compiler is gcc4.5 */ +/* (code from 4.3.2 remains the same.) */ +/* 4.4 WestfW and Maniacbug: Add m1284 support. This */ +/* does not change the 328 binary, so the */ +/* version number didn't change either. (?) */ +/* June 2011: */ +/* 4.4 WestfW: remove automatic soft_uart detect (didn't */ +/* know what it was doing or why.) Added a */ +/* check of the calculated BRG value instead. */ +/* Version stays 4.4; existing binaries are */ +/* not changed. */ +/* 4.4 WestfW: add initialization of address to keep */ +/* the compiler happy. Change SC'ed targets. */ +/* Return the SW version via READ PARAM */ +/* 4.3 WestfW: catch framing errors in getch(), so that */ +/* AVRISP works without HW kludges. */ +/* http://code.google.com/p/arduino/issues/detail?id=368n*/ +/* 4.2 WestfW: reduce code size, fix timeouts, change */ +/* verifySpace to use WDT instead of appstart */ +/* 4.1 WestfW: put version number in binary. */ +/**********************************************************/ + +#define OPTIBOOT_MAJVER 4 +#define OPTIBOOT_MINVER 5 + +#define MULTI_CALLED 1 + +#define MAKESTR(a) #a +#define MAKEVER(a, b) MAKESTR(a*256+b) + +// Page Size is 128 words (256 bytes) + +//asm(" .section .version\n" +// "optiboot_version: .word " MAKEVER(OPTIBOOT_MAJVER, OPTIBOOT_MINVER) "\n" +// " .section .text\n"); + +#include +#include +#include + +// uses sts instructions, but this version uses out instructions +// This saves cycles and program memory. +//#include "boot.h" + + +// We don't use as those routines have interrupt overhead we don't need. + +#include "pin_defs.h" +#include "stk500.h" + +#define BIND_pin 2 //PD2 +#define BIND_port PORTD +#define IS_BIND_BUTTON_on ( (BIND_port.IN & _BV(BIND_pin)) == 0x00 ) + +#ifndef LED_START_FLASHES +#define LED_START_FLASHES 0 +#endif + +#ifdef LUDICROUS_SPEED +#define BAUD_RATE 230400L +#endif + +/* set the UART baud rate defaults */ +#ifndef BAUD_RATE +#if F_CPU >= 8000000L +#define BAUD_RATE 38400L // Highest rate Avrdude win32 will support +#elsif F_CPU >= 1000000L +#define BAUD_RATE 9600L // 19200 also supported, but with significant error +#elsif F_CPU >= 128000L +#define BAUD_RATE 4800L // Good for 128kHz internal RC +#else +#define BAUD_RATE 1200L // Good even at 32768Hz +#endif +#endif + +#ifndef UART +#define UART 0 +#endif + +#if 0 +/* Switch in soft UART for hard baud rates */ +/* + * I don't understand what this was supposed to accomplish, where the + * constant "280" came from, or why automatically (and perhaps unexpectedly) + * switching to a soft uart is a good thing, so I'm undoing this in favor + * of a range check using the same calc used to config the BRG... + */ +#if (F_CPU/BAUD_RATE) > 280 // > 57600 for 16MHz +#ifndef SOFT_UART +#define SOFT_UART +#endif +#endif +#else // 0 +#if (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 > 250 +#error Unachievable baud rate (too slow) BAUD_RATE +#endif // baud rate slow check +#if (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 < 3 +#error Unachievable baud rate (too fast) BAUD_RATE +#endif // baud rate fastn check +#endif + +/* Watchdog settings */ +#define WATCHDOG_OFF (0) +#define WATCHDOG_16MS (_BV(WDE)) +#define WATCHDOG_32MS (_BV(WDP0) | _BV(WDE)) +#define WATCHDOG_64MS (_BV(WDP1) | _BV(WDE)) +#define WATCHDOG_125MS (_BV(WDP1) | _BV(WDP0) | _BV(WDE)) +#define WATCHDOG_250MS (_BV(WDP2) | _BV(WDE)) +#define WATCHDOG_500MS (_BV(WDP2) | _BV(WDP0) | _BV(WDE)) +#define WATCHDOG_1S (_BV(WDP2) | _BV(WDP1) | _BV(WDE)) +#define WATCHDOG_2S (_BV(WDP2) | _BV(WDP1) | _BV(WDP0) | _BV(WDE)) +#ifndef __AVR_ATmega8__ +#define WATCHDOG_4S (_BV(WDP3) | _BV(WDE)) +#define WATCHDOG_8S (_BV(WDP3) | _BV(WDP0) | _BV(WDE)) +#endif + +/* Function Prototypes */ +/* The main function is in init9, which removes the interrupt vector table */ +/* we don't need. It is also 'naked', which means the compiler does not */ +/* generate any entry or exit code itself. */ +int main(void) __attribute__ ((OS_main)) __attribute__ ((noreturn)) __attribute__ ((section (".init9"))); +void putch(char); +uint8_t getch(void); +static inline void getNch(uint8_t); /* "static inline" is a compiler hint to reduce code size */ +void verifySpace(); +#if LED_START_FLASHES > 0 +static inline void flash_led(uint8_t); +#endif +uint8_t getLen(); +//static inline void watchdogReset(); +void watchdogConfig(uint8_t x); +#ifdef SOFT_UART +void uartDelay() __attribute__ ((naked)); +#endif +static void appStart() ; // __attribute__ ((naked)); +void boot_spm_busy_wait() ; +void __boot_page_erase_short( uint16_t address ) ; +void __boot_page_fill_short( uint16_t address, uint16_t data) ; +void __boot_page_write_short( uint16_t address) ; +void __boot_erase_flash_buffer( uint16_t address ) ; +void init() ; + +/* + * NRWW memory + * Addresses below NRWW (Non-Read-While-Write) can be programmed while + * continuing to run code from flash, slightly speeding up programming + * time. Beware that Atmel data sheets specify this as a WORD address, + * while optiboot will be comparing against a 16-bit byte address. This + * means that on a part with 128kB of memory, the upper part of the lower + * 64k will get NRWW processing as well, even though it doesn't need it. + * That's OK. In fact, you can disable the overlapping processing for + * a part entirely by setting NRWWSTART to zero. This reduces code + * space a bit, at the expense of being slightly slower, overall. + * + * RAMSTART should be self-explanatory. It's bigger on parts with a + * lot of peripheral registers. + */ +#if defined(__AVR_ATmega168__) +#define RAMSTART (0x100) +#define NRWWSTART (0x3800) +#elif defined(__AVR_ATmega328P__) +#define RAMSTART (0x100) +#define NRWWSTART (0x7000) +#elif defined(__AVR_ATmega328__) +#define RAMSTART (0x100) +#define NRWWSTART (0x7000) +#elif defined (__AVR_ATmega644P__) +#define RAMSTART (0x100) +#define NRWWSTART (0xE000) +// correct for a bug in avr-libc +#undef SIGNATURE_2 +#define SIGNATURE_2 0x0A +#elif defined (__AVR_ATmega1284P__) +#define RAMSTART (0x100) +#define NRWWSTART (0xE000) +#elif defined(__AVR_ATtiny84__) +#define RAMSTART (0x100) +#define NRWWSTART (0x0000) +#elif defined(__AVR_ATmega1280__) +#define RAMSTART (0x200) +#define NRWWSTART (0xE000) +#elif defined(__AVR_ATmega8__) || defined(__AVR_ATmega88__) +#define RAMSTART (0x100) +#define NRWWSTART (0x1800) +#endif + +/* C zero initialises all global variables. However, that requires */ +/* These definitions are NOT zero initialised, but that doesn't matter */ +/* This allows us to drop the zero init code, saving us memory */ +#define buff ((uint8_t*)(RAMSTART)) +#ifdef VIRTUAL_BOOT_PARTITION +#define rstVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+4)) +#define wdtVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+6)) +#endif + +/* + * Handle devices with up to 4 uarts (eg m1280.) Rather inelegantly. + * Note that mega8 still needs special handling, because ubrr is handled + * differently. + */ +#if UART == 0 +# define UART_SRA UCSR0A +# define UART_SRB UCSR0B +# define UART_SRC UCSR0C +# define UART_SRL UBRR0L +# define UART_UDR UDR0 +#elif UART == 1 +# define UART_SRA UCSR1A +# define UART_SRB UCSR1B +# define UART_SRC UCSR1C +# define UART_SRL UBRR1L +# define UART_UDR UDR1 +#elif UART == 2 +# define UART_SRA UCSR2A +# define UART_SRB UCSR2B +# define UART_SRC UCSR2C +# define UART_SRL UBRR2L +# define UART_UDR UDR2 +#elif UART == 3 +# define UART_SRA UCSR3A +# define UART_SRB UCSR3B +# define UART_SRC UCSR3C +# define UART_SRL UBRR3L +# define UART_UDR UDR3 +#endif + + +/* main program starts here */ +int main(void) +{ + uint8_t ch; + uint8_t byte ; + + /* + * Making these local and in registers prevents the need for initializing + * them, and also saves space because code no longer stores to memory. + * (initializing address keeps the compiler happy, but isn't really + * necessary, and uses 4 bytes of flash.) + */ + register uint16_t address = 0; + init() ; + + // After the zero init loop, this is the first code to run. + // + // This code makes the following assumptions: + // No interrupts will execute + // SP points to RAMEND + // r1 contains zero + // + // If not, uncomment the following instructions: + // cli(); + asm volatile ("clr __zero_reg__"); + + ch = RST.STATUS ; + RST.STATUS = 0xFF ; // Clear all flags + + // Here, if power on, wait 0.1 secs, then check for + // serial Rx signal low, if so, stay in bootloader + // else go to application + + if (ch & (RST_EXTRF_bm | RST_PORF_bm ) ) + { + TCC1.CCA = 25000 ; + TCC1.INTFLAGS = TC1_CCAIF_bm ; + + while(!(TCC1.INTFLAGS & TC1_CCAIF_bm)) + ; + TCC1.CTRLA = 0 ; // Stop timer + + uint8_t x ; + x = PORTD.IN & 0x04 ; + if ( x != 0 ) + { + appStart() ; // Power on, go to app if loaded + } + } + + +//#ifndef SOFT_UART +// UART_SRA = _BV(U2X0); //Double speed mode USART0 +// UART_SRB = _BV(RXEN0) | _BV(TXEN0); +// UART_SRC = _BV(UCSZ00) | _BV(UCSZ01); +//// UART_SRL = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 ); +//// Baudrate of 57600 +//#if F_CPU == 12000000L +// UART_SRL = 25 ; +//#else +//#if F_CPU == 16000000L +// UART_SRL = 33 ; +//#else +//#ERROR Baud rate not available +//#endif +//#endif + +//#endif + + // Set up watchdog to trigger after 500ms + + +// watchdogConfig(WATCHDOG_1S); + + /* Set LED pin as output */ +#define LED_pin 1 //PD1 +#define LED_port PORTD + LED_port.DIRSET = _BV(LED_pin) ; + +//#ifdef SOFT_UART +// /* Set TX pin as output */ +// UART_DDR |= _BV(UART_TX_BIT); +//#endif + +//#if LED_START_FLASHES > 0 +// /* Flash onboard LED to signal entering of bootloader */ +// flash_led(LED_START_FLASHES * 2); +//#endif + + /* Forever loop */ + for (;;) + { + /* get character from UART */ + ch = getch(); + + if(ch == STK_GET_PARAMETER) + { + byte = getch(); + verifySpace(); + if ( byte == 0x82) + { + /* + * Send optiboot version as "minor SW version" + */ + putch(OPTIBOOT_MINVER); + } + else if ( byte == 0x81) + { + putch(OPTIBOOT_MAJVER); + } + else + { + /* + * GET PARAMETER returns a generic 0x03 reply for + * other parameters - enough to keep Avrdude happy + */ + putch(0x03); + } + } + else if(ch == STK_SET_DEVICE) { + // SET DEVICE is ignored + getNch(20); + } + else if(ch == STK_SET_DEVICE_EXT) + { + // SET DEVICE EXT is ignored + getNch(5); + } + else if(ch == STK_LOAD_ADDRESS) + { + // LOAD ADDRESS + uint16_t newAddress; + newAddress = getch() ; + newAddress = (newAddress & 0xff) | (getch() << 8); +#ifdef RAMPZ + // Transfer top bit to RAMPZ + RAMPZ = (newAddress & 0x8000) ? 1 : 0; +#endif +// newAddress += newAddress; // Convert from word address to byte address + address = newAddress; + verifySpace(); + } + else if(ch == STK_UNIVERSAL) + { + // UNIVERSAL command is ignored + getNch(4); + putch(0x00); + } + /* Write memory, length is big endian and is in bytes */ + else if(ch == STK_PROG_PAGE) + { + // PROGRAM PAGE - we support flash programming only, not EEPROM + uint8_t *bufPtr; + uint16_t addrPtr; + register uint8_t length; + + getch(); /* getlen() */ + length = getch(); + getch(); + + // If we are in RWW section, immediately start page erase +// if (address < NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address); + __boot_page_erase_short((uint16_t)(void*)address); + + // While that is going on, read in page contents + bufPtr = buff; + do *bufPtr++ = getch(); + while (--length); + + // If we are in NRWW section, page erase has to be delayed until now. + // Todo: Take RAMPZ into account +//#ifdef MULTI_CALLED +// if (address < 0x7E00) +//#endif +// { +// if (address >= NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address); +// } + // Read command terminator, start reply + verifySpace(); + + // If only a partial page is to be programmed, the erase might not be complete. + // So check that here +#ifdef MULTI_CALLED + if (address < 0x8000) +#endif + { + boot_spm_busy_wait(); + +#ifdef VIRTUAL_BOOT_PARTITION + if ((uint16_t)(void*)address == 0) { + // This is the reset vector page. We need to live-patch the code so the + // bootloader runs. + // + // Move RESET vector to WDT vector + uint16_t vect = buff[0] | (buff[1]<<8); + rstVect = vect; + wdtVect = buff[8] | (buff[9]<<8); + vect -= 4; // Instruction is a relative jump (rjmp), so recalculate. + buff[8] = vect & 0xff; + buff[9] = vect >> 8; + + // Add jump to bootloader at RESET vector + buff[0] = 0x7f; + buff[1] = 0xce; // rjmp 0x1d00 instruction + } +#endif + + // Copy buffer into programming buffer + bufPtr = buff; + addrPtr = (uint16_t)(void*)address; + ch = SPM_PAGESIZE / 2; + __boot_erase_flash_buffer((uint16_t)(void*)addrPtr ) ; + do { + uint16_t a; + // a = *bufPtr++; + // a |= (*bufPtr++) << 8; + + a = *((uint16_t *)bufPtr) ; + bufPtr += 2 ; + + __boot_page_fill_short((uint16_t)(void*)addrPtr,a); + addrPtr += 2; + } while (--ch); + + // Write from programming buffer + __boot_page_write_short((uint16_t)(void*)address); + boot_spm_busy_wait(); + +#if defined(RWWSRE) + // Reenable read access to flash + boot_rww_enable(); +#endif + } + } + /* Read memory block mode, length is big endian. */ + else if(ch == STK_READ_PAGE) + { + register uint8_t length; + // READ PAGE - we only read flash + getch(); /* getlen() */ + length = getch(); + getch(); + + verifySpace(); +//#ifdef VIRTUAL_BOOT_PARTITION +// do { +// // Undo vector patch in bottom page so verify passes +// if (address == 0) ch=rstVect & 0xff; +// else if (address == 1) ch=rstVect >> 8; +// else if (address == 8) ch=wdtVect & 0xff; +// else if (address == 9) ch=wdtVect >> 8; +// else ch = pgm_read_byte_near(address); +// address++; +// putch(ch); +// } while (--length); +//#else +//#ifdef RAMPZ +//// Since RAMPZ should already be set, we need to use EPLM directly. +//// do putch(pgm_read_byte_near(address++)); +//// while (--length); +// do { +// uint8_t result; +// __asm__ ("elpm %0,Z\n":"=r"(result):"z"(address)); +// putch(result); +// address++; +// } +// while (--length); +//#else + do putch(pgm_read_byte_near(address++)); + while (--length); +//#endif +//#endif + } + + /* Get device signature bytes */ + else if(ch == STK_READ_SIGN) + { + // READ SIGN - return what Avrdude wants to hear + verifySpace(); + putch(SIGNATURE_0); + putch(SIGNATURE_1); + putch(SIGNATURE_2); + } + else if (ch == STK_LEAVE_PROGMODE) { /* 'Q' */ + // Adaboot no-wait mod + +// watchdogConfig(WATCHDOG_16MS); + + verifySpace(); +#ifdef MULTI_CALLED + putch(STK_OK); + while(!(USARTC0.STATUS & USART_TXCIF_bm)) + ; + appStart() ; +#endif + } + else + { + // This covers the response to commands like STK_ENTER_PROGMODE + verifySpace(); + } + putch(STK_OK); + } +} + +void putch(char ch) +{ +//#ifndef SOFT_UART + while(!(USARTC0.STATUS & USART_DREIF_bm)) + ; + USARTC0.DATA = ch ; +//#else +// __asm__ __volatile__ ( +// " com %[ch]\n" // ones complement, carry set +// " sec\n" +// "1: brcc 2f\n" +// " cbi %[uartPort],%[uartBit]\n" +// " rjmp 3f\n" +// "2: sbi %[uartPort],%[uartBit]\n" +// " nop\n" +// "3: rcall uartDelay\n" +// " rcall uartDelay\n" +// " lsr %[ch]\n" +// " dec %[bitcnt]\n" +// " brne 1b\n" +// : +// : +// [bitcnt] "d" (10), +// [ch] "r" (ch), +// [uartPort] "I" (_SFR_IO_ADDR(UART_PORT)), +// [uartBit] "I" (UART_TX_BIT) +// : +// "r25" +// ); +//#endif +} + +uint8_t getch(void) +{ + uint8_t ch; + +//#ifdef LED_DATA_FLASH +//#ifdef __AVR_ATmega8__ +// LED_PORT ^= _BV(LED); +//#else +// LED_PIN |= _BV(LED); +//#endif +//#endif + +//#ifdef SOFT_UART +// __asm__ __volatile__ ( +// "1: sbic %[uartPin],%[uartBit]\n" // Wait for start edge +// " rjmp 1b\n" +// " rcall uartDelay\n" // Get to middle of start bit +// "2: rcall uartDelay\n" // Wait 1 bit period +// " rcall uartDelay\n" // Wait 1 bit period +// " clc\n" +// " sbic %[uartPin],%[uartBit]\n" +// " sec\n" +// " dec %[bitCnt]\n" +// " breq 3f\n" +// " ror %[ch]\n" +// " rjmp 2b\n" +// "3:\n" +// : +// [ch] "=r" (ch) +// : +// [bitCnt] "d" (9), +// [uartPin] "I" (_SFR_IO_ADDR(UART_PIN)), +// [uartBit] "I" (UART_RX_BIT) +// : +// "r25" +//); +//#else + while(!(USARTC0.STATUS & USART_RXCIF_bm)) + +// watchdogReset() + + ; +// if (!(UART_SRA & _BV(FE0))) { + /* + * A Framing Error indicates (probably) that something is talking + * to us at the wrong bit rate. Assume that this is because it + * expects to be talking to the application, and DON'T reset the + * watchdog. This should cause the bootloader to abort and run + * the application "soon", if it keeps happening. (Note that we + * don't care that an invalid char is returned...) + */ +// watchdogReset(); +// } + + ch = USARTC0.DATA ; +//#endif + +//#ifdef LED_DATA_FLASH +//#ifdef __AVR_ATmega8__ +// LED_PORT ^= _BV(LED); +//#else +// LED_PIN |= _BV(LED); +//#endif +//#endif + + return ch; +} + +#ifdef SOFT_UART +// AVR305 equation: #define UART_B_VALUE (((F_CPU/BAUD_RATE)-23)/6) +// Adding 3 to numerator simulates nearest rounding for more accurate baud rates +#define UART_B_VALUE (((F_CPU/BAUD_RATE)-20)/6) +#if UART_B_VALUE > 255 +#error Baud rate too slow for soft UART +#endif + +void uartDelay() { + __asm__ __volatile__ ( + "ldi r25,%[count]\n" + "1:dec r25\n" + "brne 1b\n" + "ret\n" + ::[count] "M" (UART_B_VALUE) + ); +} +#endif + +void getNch(uint8_t count) { + do getch(); while (--count); + verifySpace(); +} + +void verifySpace() +{ + if ( getch() != CRC_EOP) { + + putch(STK_NOSYNC); +// watchdogConfig(WATCHDOG_16MS); // shorten WD timeout +// +// while (1) // and busy-loop so that WD causes +// ; // a reset and app start. + } + putch(STK_INSYNC); +} + +#if LED_START_FLASHES > 0 +void flash_led(uint8_t count) { + do { + TCNT1 = -(F_CPU/(1024*16)); + TIFR1 = _BV(TOV1); + while(!(TIFR1 & _BV(TOV1))); +//#ifdef __AVR_ATmega8__ + LED_PORT ^= _BV(LED); +//#else +// LED_PIN |= _BV(LED); +//#endif + watchdogReset(); + } while (--count); +} +#endif + +// Watchdog functions. These are only safe with interrupts turned off. +void watchdogReset() { + __asm__ __volatile__ ( + "wdr\n" + ); +} + +//void watchdogConfig(uint8_t x) { +// WDTCSR = _BV(WDCE) | _BV(WDE); +// WDTCSR = x; +//} + +void init() +{ + // Enable external oscillator (16MHz) + OSC.XOSCCTRL = OSC_FRQRANGE_12TO16_gc | OSC_XOSCSEL_XTAL_256CLK_gc ; + OSC.CTRL |= OSC_XOSCEN_bm ; + while( ( OSC.STATUS & OSC_XOSCRDY_bm ) == 0 ) + /* wait */ ; + // Enable PLL (*2 = 32MHz) + OSC.PLLCTRL = OSC_PLLSRC_XOSC_gc | 2 ; + OSC.CTRL |= OSC_PLLEN_bm ; + while( ( OSC.STATUS & OSC_PLLRDY_bm ) == 0 ) + /* wait */ ; + // Switch to PLL clock + CPU_CCP = 0xD8 ; + CLK.CTRL = CLK_SCLKSEL_RC2M_gc ; + CPU_CCP = 0xD8 ; + CLK.CTRL = CLK_SCLKSEL_PLL_gc ; + + PMIC.CTRL = 7 ; // Enable all interrupt levels + + + // Timer1 config + // TCC1 16-bit timer, clocked at 0.5uS + EVSYS.CH3MUX = 0x80 + 0x07 ; // Prescaler of 128 + TCC1.CTRLB = 0; TCC1.CTRLC = 0; TCC1.CTRLD = 0; TCC1.CTRLE = 0; + TCC1.INTCTRLA = 0 ; + TCC1.INTCTRLB = 0 ; + TCC1.PER = 0xFFFF ; + TCC1.CNT = 0 ; + TCC1.CTRLA = 0x0B ; // Event3 (prescale of 16) + + PORTD.OUTSET = 0x04 ; + PORTD.DIRCLR = 0x04 ; + PORTD.PIN2CTRL = 0x18 ; // Pullup + + PORTC.OUTSET = 0x08 ; + PORTC.DIRSET = 0x08 ; + + USARTC0.BAUDCTRLA = 34 ; // 57600 + USARTC0.BAUDCTRLB = 0 ; + + USARTC0.CTRLB = 0x18 ; // Enable Tx and Rx + USARTC0.CTRLA = (USARTC0.CTRLA & 0xCF) ; + USARTC0.CTRLC = 0x03 ; // 8 bit, no parity, 1 stop + USARTC0.DATA ; +} + +void boot_spm_busy_wait() +{ + while(NVM.STATUS & NVM_NVMBUSY_bm) + ; +} + +#define A_NVM_CMD 0x1CA + +void __boot_page_erase_short( uint16_t address ) +{ + asm( "push r24" ) ; + asm( "push r25" ) ; + NVM.CMD = NVM_CMD_ERASE_APP_PAGE_gc ; + asm( "pop r31" ) ; + asm( "pop r30" ) ; + CCP = CCP_SPM_gc ; + asm( "spm" ) ; +} + +void __boot_erase_flash_buffer( uint16_t address ) +{ + asm( "movw r30,r24" ) ; + asm( "ldi r24,0x26" ) ; + asm("sts 0x1CA,r24"); + CCP = CCP_IOREG_gc ; + asm( "ldi r24,1" ) ; + asm("sts 0x1CB,r24"); +} + +void __boot_page_fill_short( uint16_t address, uint16_t data) +{ + asm( "push r0" ) ; + asm( "push r1" ) ; + asm( "movw r30,r24" ) ; + asm( "mov r0,r22" ) ; + asm( "mov r1,r23" ) ; + asm( "ldi r24,0x23" ) ; + asm("sts 0x1CA,r24"); + CCP = CCP_SPM_gc ; + asm( "spm" ) ; + asm( "pop r1" ) ; + asm( "pop r0" ) ; +} + +void __boot_page_write_short( uint16_t address) +{ + asm( "movw r30,r24" ) ; + asm( "ldi r24,0x2E" ) ; + asm("sts 0x1CA,r24"); + CCP = CCP_SPM_gc ; + asm( "spm" ) ; +} + +void appStart() +{ +// watchdogConfig(WATCHDOG_OFF); +// __asm__ __volatile__ ( +//#ifdef VIRTUAL_BOOT_PARTITION +// // Jump to WDT vector +// "ldi r30,4\n" +// "clr r31\n" +//#else +// // Jump to RST vector +// "clr r30\n" +// "clr r31\n" +//#endif +// "ijmp\n" +// ); + + register void (*p)() ; + p = 0 ; + + if ( pgm_read_byte( (uint16_t)p ) != 0xFF ) + { + (*p)() ; + } +} + diff --git a/BootLoaders/OrangeMultiBoot/Source/pin_defs.h b/BootLoaders/OrangeMultiBoot/Source/pin_defs.h new file mode 100644 index 0000000..9623969 --- /dev/null +++ b/BootLoaders/OrangeMultiBoot/Source/pin_defs.h @@ -0,0 +1,80 @@ +#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega88) || defined(__AVR_ATmega8__) || defined(__AVR_ATmega88__) +/* Onboard LED is connected to pin PB5 in Arduino NG, Diecimila, and Duemilanove */ +#define LED_DDR DDRB +#define LED_PORT PORTB +#define LED_PIN PINB +#define LED PINB5 + +/* Ports for soft UART */ +#ifdef SOFT_UART +#define UART_PORT PORTD +#define UART_PIN PIND +#define UART_DDR DDRD +#define UART_TX_BIT 1 +#define UART_RX_BIT 0 +#endif +#endif + +#if defined(__AVR_ATmega8__) + //Name conversion R.Wiersma + #define UCSR0A UCSRA + #define UDR0 UDR + #define UDRE0 UDRE + #define RXC0 RXC + #define FE0 FE + #define TIFR1 TIFR + #define WDTCSR WDTCR +#endif + +/* Luminet support */ +#if defined(__AVR_ATtiny84__) +/* Red LED is connected to pin PA4 */ +#define LED_DDR DDRA +#define LED_PORT PORTA +#define LED_PIN PINA +#define LED PINA4 +/* Ports for soft UART - left port only for now. TX/RX on PA2/PA3 */ +#ifdef SOFT_UART +#define UART_PORT PORTA +#define UART_PIN PINA +#define UART_DDR DDRA +#define UART_TX_BIT 2 +#define UART_RX_BIT 3 +#endif +#endif + +/* Sanguino support */ +#if defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__) +/* Onboard LED is connected to pin PB0 on Sanguino */ +#define LED_DDR DDRB +#define LED_PORT PORTB +#define LED_PIN PINB +#define LED PINB0 + +/* Ports for soft UART */ +#ifdef SOFT_UART +#define UART_PORT PORTD +#define UART_PIN PIND +#define UART_DDR DDRD +#define UART_TX_BIT 1 +#define UART_RX_BIT 0 +#endif +#endif + +/* Mega support */ +#if defined(__AVR_ATmega1280__) +/* Onboard LED is connected to pin PB7 on Arduino Mega */ +#define LED_DDR DDRB +#define LED_PORT PORTB +#define LED_PIN PINB +#define LED PINB7 + +/* Ports for soft UART */ +#ifdef SOFT_UART +#define UART_PORT PORTE +#define UART_PIN PINE +#define UART_DDR DDRE +#define UART_TX_BIT 1 +#define UART_RX_BIT 0 +#endif +#endif diff --git a/BootLoaders/OrangeMultiBoot/Source/stk500.h b/BootLoaders/OrangeMultiBoot/Source/stk500.h new file mode 100644 index 0000000..ca0dd91 --- /dev/null +++ b/BootLoaders/OrangeMultiBoot/Source/stk500.h @@ -0,0 +1,39 @@ +/* STK500 constants list, from AVRDUDE */ +#define STK_OK 0x10 +#define STK_FAILED 0x11 // Not used +#define STK_UNKNOWN 0x12 // Not used +#define STK_NODEVICE 0x13 // Not used +#define STK_INSYNC 0x14 // ' ' +#define STK_NOSYNC 0x15 // Not used +#define ADC_CHANNEL_ERROR 0x16 // Not used +#define ADC_MEASURE_OK 0x17 // Not used +#define PWM_CHANNEL_ERROR 0x18 // Not used +#define PWM_ADJUST_OK 0x19 // Not used +#define CRC_EOP 0x20 // 'SPACE' +#define STK_GET_SYNC 0x30 // '0' +#define STK_GET_SIGN_ON 0x31 // '1' +#define STK_SET_PARAMETER 0x40 // '@' +#define STK_GET_PARAMETER 0x41 // 'A' +#define STK_SET_DEVICE 0x42 // 'B' +#define STK_SET_DEVICE_EXT 0x45 // 'E' +#define STK_ENTER_PROGMODE 0x50 // 'P' +#define STK_LEAVE_PROGMODE 0x51 // 'Q' +#define STK_CHIP_ERASE 0x52 // 'R' +#define STK_CHECK_AUTOINC 0x53 // 'S' +#define STK_LOAD_ADDRESS 0x55 // 'U' +#define STK_UNIVERSAL 0x56 // 'V' +#define STK_PROG_FLASH 0x60 // '`' +#define STK_PROG_DATA 0x61 // 'a' +#define STK_PROG_FUSE 0x62 // 'b' +#define STK_PROG_LOCK 0x63 // 'c' +#define STK_PROG_PAGE 0x64 // 'd' +#define STK_PROG_FUSE_EXT 0x65 // 'e' +#define STK_READ_FLASH 0x70 // 'p' +#define STK_READ_DATA 0x71 // 'q' +#define STK_READ_FUSE 0x72 // 'r' +#define STK_READ_LOCK 0x73 // 's' +#define STK_READ_PAGE 0x74 // 't' +#define STK_READ_SIGN 0x75 // 'u' +#define STK_READ_OSCCAL 0x76 // 'v' +#define STK_READ_FUSE_EXT 0x77 // 'w' +#define STK_READ_OSCCAL_EXT 0x78 // 'x' diff --git a/BootLoaders/README.md b/BootLoaders/README.md new file mode 100644 index 0000000..68089dd --- /dev/null +++ b/BootLoaders/README.md @@ -0,0 +1,32 @@ +# Arduino IDE board definition for Multi 4-in-1 transmitter module +At this point the only supported board/module is the Atmega328p-based module, the STM32-based module is not yet supported. + +## Installing +The board definition is installed using the Arduino IDE Boards Manager. + +1. Open the Arduino IDE +2. Go to File->Preferences (or Ctrl+Comma) +3. Locate the 'Aditional Boards Manager URLs' field and paste in this URL: https://raw.githubusercontent.com/pascallanger/DIY-Multiprotocol-TX-Module/tree/master/BootLoaders/package_multi_4in1_board_index.json +4. Click OK to save the change +5. Click Tools->Board [Board Name]->Boards Manager +6. Scroll to the bottom of the list of boards and click on 'Multi 4-in-1 Boards' then click the Install button +7. Click Close to close the Boards Manager + +## Selecting the board +1. Click Tools->Board [Board Name] +2. Scroll down the list to 'Multi 4-in-1 Boards' and select 'Multi 4-in-1 (Atmega328p, 3.3V, 16MHz)' + +## Choosing the bootloader +There are two bootloader options. The default 'No bootloader' won't install a bootloader, allowing the maximum space for protocols. The 'Flash from TX' option installs a small Optiboot bootloader which is compatible with Ersky9x and OpenTX option to flash firmware from the transmitter's maintenance menu. + +1. Click Tools->Bootloader [Bootloader Option] +2. Select the desired bootloader + +**Recommended:** Click Tools->Burn Bootloader to set the fuses, even if the 'No bootloader' option was selected. + +## Compiling / uploading firmware with the 'Flash from TX' bootloader +1. Follow the normal compiling method. +2. Copy the compiled .hex file (usually Multiprotocol.ino.hex) in the "/firmware" directory of the SD card. +3. Start Ersky9x in "Maintenance Mode" by holding the horizontal trims APART while powering on the transmitter. +4. Select "Update Multi", then change "File Type" to "HEX", then select "Update", choose the firmware to flash, long pressto select it and long press to flash it. +5. When finished, long press EXIT to reboot in normal mode. diff --git a/BootLoaders/StmMultiBoot/README.md b/BootLoaders/StmMultiBoot/README.md new file mode 100644 index 0000000..5765b71 --- /dev/null +++ b/BootLoaders/StmMultiBoot/README.md @@ -0,0 +1 @@ +[Source for the StmMultiBooloader](https://github.com/MikeBland/StmMultiBoot) diff --git a/BootLoaders/StmMultiBoot/StmMultiBoot.bin b/BootLoaders/StmMultiBoot/StmMultiBoot.bin new file mode 100644 index 0000000000000000000000000000000000000000..022e373261960c60cb096ce13a7f77a35eee15d5 GIT binary patch literal 7788 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 M_+f#MreS0DU+KoN6951J literal 0 HcmV?d00001 diff --git a/Multiprotocol/AFHDS2A_a7105.ino b/Multiprotocol/AFHDS2A_a7105.ino index 158142d..2eacf45 100644 --- a/Multiprotocol/AFHDS2A_a7105.ino +++ b/Multiprotocol/AFHDS2A_a7105.ino @@ -179,12 +179,26 @@ static void AFHDS2A_build_packet(uint8_t type) packet[0] = 0x56; for(uint8_t ch=0; ch<14; ch++) { - /*if((Model.limits[ch].flags & CH_FAILSAFE_EN)) +#ifdef AFHDS2A_FAILSAFE + int8_t failsafe = AFHDS2AFailsafe[ch]; + // + if(failsafe != -1) { - packet[9 + ch*2] = Servo_data[CH_AETR[ch]] & 0xff; - packet[10+ ch*2] = (Servo_data[CH_AETR[ch]] >> 8) & 0xff; + // + if (failsafe > AFHDS2AFailsafeMAX) + failsafe = AFHDS2AFailsafeMAX; + // + if (failsafe < AFHDS2AFailsafeMIN) + failsafe = AFHDS2AFailsafeMIN; + // + double scale = (float)failsafe/(float)100; + int16_t failsafeMicros = 1500 + ((float)512 * scale); + // + packet[9 + ch*2] = failsafeMicros & 0xff; + packet[10+ ch*2] = ( failsafeMicros >> 8) & 0xff; } - else*/ + else +#endif { packet[9 + ch*2] = 0xff; packet[10+ ch*2] = 0xff; diff --git a/Multiprotocol/Bayang_nrf24l01.ino b/Multiprotocol/Bayang_nrf24l01.ino index 043dd0c..5cd2a99 100644 --- a/Multiprotocol/Bayang_nrf24l01.ino +++ b/Multiprotocol/Bayang_nrf24l01.ino @@ -25,19 +25,22 @@ Multiprotocol is distributed in the hope that it will be useful, #define BAYANG_PACKET_SIZE 15 #define BAYANG_RF_NUM_CHANNELS 4 #define BAYANG_RF_BIND_CHANNEL 0 +#define BAYANG_RF_BIND_CHANNEL_X16_AH 10 #define BAYANG_ADDRESS_LENGTH 5 enum BAYANG_FLAGS { - // flags going to packet[2] - BAYANG_FLAG_RTH = 0x01, - BAYANG_FLAG_HEADLESS = 0x02, - BAYANG_FLAG_FLIP = 0x08, - BAYANG_FLAG_VIDEO = 0x10, - BAYANG_FLAG_PICTURE = 0x20, - // flags going to packet[3] - BAYANG_FLAG_INVERTED = 0x80 // inverted flight on Floureon H101 + // flags going to packet[2] + BAYANG_FLAG_RTH = 0x01, + BAYANG_FLAG_HEADLESS = 0x02, + BAYANG_FLAG_FLIP = 0x08, + BAYANG_FLAG_VIDEO = 0x10, + BAYANG_FLAG_PICTURE = 0x20, + // flags going to packet[3] + BAYANG_FLAG_INVERTED = 0x80, // inverted flight on Floureon H101 + BAYANG_FLAG_TAKE_OFF = 0x20, // take off / landing on X16 AH }; +uint8_t bayang_bind_chan; static void __attribute__((unused)) BAYANG_send_packet(uint8_t bind) { uint8_t i; @@ -53,13 +56,29 @@ static void __attribute__((unused)) BAYANG_send_packet(uint8_t bind) packet[i+1]=rx_tx_addr[i]; for(i=0;i<4;i++) packet[i+6]=hopping_frequency[i]; - packet[10] = rx_tx_addr[0]; // txid[0] - packet[11] = rx_tx_addr[1]; // txid[1] + switch (sub_protocol) + { + case X16_AH: + packet[10] = 0x00; + packet[11] = 0x00; + break; + default: + packet[10] = rx_tx_addr[0]; // txid[0] + packet[11] = rx_tx_addr[1]; // txid[1] + break; + } } else { uint16_t val; - packet[0] = 0xA5; + switch (sub_protocol) { + case X16_AH: + packet[0] = 0xA6; + break; + default: + packet[0] = 0xA5; + break; + } packet[1] = 0xFA; // normal mode is 0xf7, expert 0xfa //Flags packet[2] @@ -78,7 +97,8 @@ static void __attribute__((unused)) BAYANG_send_packet(uint8_t bind) packet[3] = 0x00; if(Servo_AUX6) packet[3] = BAYANG_FLAG_INVERTED; - + if(Servo_AUX7) + packet[3] |= BAYANG_FLAG_TAKE_OFF; //Aileron val = convert_channel_10b(AILERON); packet[4] = (val>>8) + ((val>>2) & 0xFC); @@ -96,13 +116,26 @@ static void __attribute__((unused)) BAYANG_send_packet(uint8_t bind) packet[10] = (val>>8) + (val>>2 & 0xFC); packet[11] = val & 0xFF; } - packet[12] = rx_tx_addr[2]; // txid[2] - packet[13] = sub_protocol==H8S3D?0x34:0x0A; + switch (sub_protocol) + { + case H8S3D: + packet[12] = rx_tx_addr[2]; // txid[2] + packet[13] = 0x34; + break; + case X16_AH: + packet[12] = 0; + packet[13] = 0; + break; + default: + packet[12] = rx_tx_addr[2]; // txid[2] + packet[13] = 0x0A; + break; + } packet[14] = 0; - for (uint8_t i=0; i < BAYANG_PACKET_SIZE-1; i++) + for (uint8_t i=0; i < BAYANG_PACKET_SIZE-1; i++) packet[14] += packet[i]; - NRF24L01_WriteReg(NRF24L01_05_RF_CH, bind ? BAYANG_RF_BIND_CHANNEL:hopping_frequency[hopping_frequency_no++]); + NRF24L01_WriteReg(NRF24L01_05_RF_CH, bind ? bayang_bind_chan:hopping_frequency[hopping_frequency_no++]); hopping_frequency_no%=BAYANG_RF_NUM_CHANNELS; // clear packet status bits and TX FIFO @@ -111,17 +144,17 @@ static void __attribute__((unused)) BAYANG_send_packet(uint8_t bind) XN297_WritePayload(packet, BAYANG_PACKET_SIZE); - NRF24L01_SetTxRxMode(TXRX_OFF); - NRF24L01_SetTxRxMode(TX_EN); + NRF24L01_SetTxRxMode(TXRX_OFF); + NRF24L01_SetTxRxMode(TX_EN); // Power on, TX mode, 2byte CRC // Why CRC0? xn297 does not interpret it - either 16-bit CRC or nothing XN297_Configure(_BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO) | _BV(NRF24L01_00_PWR_UP)); #ifdef BAYANG_HUB_TELEMETRY - if (option) + if (option) { // switch radio to rx as soon as packet is sent - while (!(NRF24L01_ReadReg(NRF24L01_07_STATUS) & _BV(NRF24L01_07_TX_DS))); + while (!(NRF24L01_ReadReg(NRF24L01_07_STATUS) & _BV(NRF24L01_07_TX_DS))); NRF24L01_WriteReg(NRF24L01_00_CONFIG, 0x03); } #endif @@ -170,16 +203,16 @@ static void __attribute__((unused)) BAYANG_init() NRF24L01_FlushTx(); NRF24L01_FlushRx(); - NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); // Clear data ready, data sent, and retransmit + NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); // Clear data ready, data sent, and retransmit NRF24L01_WriteReg(NRF24L01_01_EN_AA, 0x00); // No Auto Acknowldgement on all data pipes - NRF24L01_WriteReg(NRF24L01_02_EN_RXADDR, 0x01); // Enable data pipe 0 only - NRF24L01_WriteReg(NRF24L01_11_RX_PW_P0, BAYANG_PACKET_SIZE); - NRF24L01_SetBitrate(NRF24L01_BR_1M); // 1Mbps - NRF24L01_SetPower(); - NRF24L01_Activate(0x73); // Activate feature register - NRF24L01_WriteReg(NRF24L01_1C_DYNPD, 0x00); // Disable dynamic payload length on all pipes - NRF24L01_WriteReg(NRF24L01_1D_FEATURE, 0x01); - NRF24L01_Activate(0x73); + NRF24L01_WriteReg(NRF24L01_02_EN_RXADDR, 0x01); // Enable data pipe 0 only + NRF24L01_WriteReg(NRF24L01_11_RX_PW_P0, BAYANG_PACKET_SIZE); + NRF24L01_SetBitrate(NRF24L01_BR_1M); // 1Mbps + NRF24L01_SetPower(); + NRF24L01_Activate(0x73); // Activate feature register + NRF24L01_WriteReg(NRF24L01_1C_DYNPD, 0x00); // Disable dynamic payload length on all pipes + NRF24L01_WriteReg(NRF24L01_1D_FEATURE, 0x01); + NRF24L01_Activate(0x73); } uint16_t BAYANG_callback() @@ -250,10 +283,18 @@ uint16_t initBAYANG(void) BAYANG_initialize_txid(); BAYANG_init(); packet_count=0; -#ifdef BAYANG_HUB_TELEMETRY - init_frskyd_link_telemetry(); - telemetry_lost=1; // do not send telemetry to TX right away until we have a TX_RSSI value to prevent warning message... -#endif + switch (sub_protocol) { + case X16_AH: + bayang_bind_chan = BAYANG_RF_BIND_CHANNEL_X16_AH; + break; + default: + bayang_bind_chan = BAYANG_RF_BIND_CHANNEL; + break; + } + #ifdef BAYANG_HUB_TELEMETRY + init_frskyd_link_telemetry(); + telemetry_lost=1; // do not send telemetry to TX right away until we have a TX_RSSI value to prevent warning message... + #endif return BAYANG_INITIAL_WAIT+BAYANG_PACKET_PERIOD; } diff --git a/Multiprotocol/FrSkyX_cc2500.ino b/Multiprotocol/FrSkyX_cc2500.ino new file mode 100644 index 0000000..fb514c7 --- /dev/null +++ b/Multiprotocol/FrSkyX_cc2500.ino @@ -0,0 +1,302 @@ + +/* ************************** + * By Midelic on RCGroups * + ************************** + This project is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Multiprotocol is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Multiprotocol. If not, see . +*/ + +#if defined(FRSKYX_CC2500_INO) + +#include "iface_cc2500.h" + +uint8_t chanskip; +//uint8_t seq_last_sent; +//uint8_t seq_last_rcvd; + +uint8_t FrX_send_seq ; +uint8_t FrX_receive_seq ; + +static void __attribute__((unused)) set_start(uint8_t ch ) +{ + CC2500_Strobe(CC2500_SIDLE); + CC2500_WriteReg(CC2500_25_FSCAL1, calData[ch]); + CC2500_WriteReg(CC2500_0A_CHANNR, hopping_frequency[ch]); +} + +static void __attribute__((unused)) frskyX_init() +{ + FRSKY_init_cc2500((sub_protocol&2)?FRSKYXEU_cc2500_conf:FRSKYX_cc2500_conf); // LBT or FCC + // + for(uint8_t c=0;c < 48;c++) + {//calibrate hop channels + CC2500_Strobe(CC2500_SIDLE); + CC2500_WriteReg(CC2500_0A_CHANNR,hopping_frequency[c]); + CC2500_Strobe(CC2500_SCAL); + delayMicroseconds(900);// + calData[c] = CC2500_ReadReg(CC2500_25_FSCAL1); + } + //#######END INIT######## +} + +static void __attribute__((unused)) initialize_data(uint8_t adr) +{ + CC2500_WriteReg(CC2500_0C_FSCTRL0,option); // Frequency offset hack + CC2500_WriteReg(CC2500_18_MCSM0, 0x8); + CC2500_WriteReg(CC2500_09_ADDR, adr ? 0x03 : rx_tx_addr[3]); + CC2500_WriteReg(CC2500_07_PKTCTRL1,0x05); +} + +//**CRC** +const uint16_t PROGMEM CRC_Short[]={ + 0x0000, 0x1189, 0x2312, 0x329B, 0x4624, 0x57AD, 0x6536, 0x74BF, + 0x8C48, 0x9DC1, 0xAF5A, 0xBED3, 0xCA6C, 0xDBE5, 0xE97E, 0xF8F7 }; +static uint16_t CRCTable(uint8_t val) +{ + uint16_t word ; + word = pgm_read_word(&CRC_Short[val&0x0F]) ; + val /= 16 ; + return word ^ (0x1081 * val) ; +} +static uint16_t __attribute__((unused)) crc_x(uint8_t *data, uint8_t len) +{ + uint16_t crc = 0; + for(uint8_t i=0; i < len; i++) + crc = (crc<<8) ^ CRCTable((uint8_t)(crc>>8) ^ *data++); + return crc; +} + + // 0-2047, 0 = 817, 1024 = 1500, 2047 = 2182 + //64=860,1024=1500,1984=2140//Taranis 125% + +static uint16_t __attribute__((unused)) scaleForPXX( uint8_t i ) +{ //mapped 860,2140(125%) range to 64,1984(PXX values); + return (uint16_t)(((Servo_data[i]-servo_min_125)*3)>>1)+64; +} + +static void __attribute__((unused)) frskyX_build_bind_packet() +{ + packet[0] = (sub_protocol & 2 ) ? 0x20 : 0x1D ; // LBT or FCC + packet[1] = 0x03; + packet[2] = 0x01; + // + packet[3] = rx_tx_addr[3]; + packet[4] = rx_tx_addr[2]; + int idx = ((state -FRSKY_BIND) % 10) * 5; + packet[5] = idx; + packet[6] = hopping_frequency[idx++]; + packet[7] = hopping_frequency[idx++]; + packet[8] = hopping_frequency[idx++]; + packet[9] = hopping_frequency[idx++]; + packet[10] = hopping_frequency[idx++]; + packet[11] = 0x02; + packet[12] = RX_num; + // + uint8_t limit = (sub_protocol & 2 ) ? 31 : 28 ; + memset(&packet[13], 0, limit - 13); + uint16_t lcrc = crc_x(&packet[3], limit-3); + // + packet[limit++] = lcrc >> 8; + packet[limit] = lcrc; + // +} + +static void __attribute__((unused)) frskyX_data_frame() +{ + //0x1D 0xB3 0xFD 0x02 0x56 0x07 0x15 0x00 0x00 0x00 0x04 0x40 0x00 0x04 0x40 0x00 0x04 0x40 0x00 0x04 0x40 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x96 0x12 + // + static uint8_t lpass; + uint16_t chan_0 ; + uint16_t chan_1 ; + uint8_t startChan = 0; + // + packet[0] = (sub_protocol & 2 ) ? 0x20 : 0x1D ; // LBT or FCC + packet[1] = rx_tx_addr[3]; + packet[2] = rx_tx_addr[2]; + packet[3] = 0x02; + // + packet[4] = (chanskip<<6)|hopping_frequency_no; + packet[5] = chanskip>>2; + packet[6] = RX_num; + //packet[7] = FLAGS 00 - standard packet + //10, 12, 14, 16, 18, 1A, 1C, 1E - failsafe packet + //20 - range check packet + packet[7] = 0; + packet[8] = 0; + // + if ( lpass & 1 ) + startChan += 8 ; + + for(uint8_t i = 0; i <12 ; i+=3) + {//12 bytes + chan_0 = scaleForPXX(startChan); + if(lpass & 1 ) + chan_0+=2048; + startChan+=1; + // + chan_1 = scaleForPXX(startChan); + if(lpass & 1 ) + chan_1+= 2048; + startChan+=1; + // + packet[9+i] = lowByte(chan_0);//3 bytes*4 + packet[9+i+1]=(((chan_0>>8) & 0x0F)|(chan_1 << 4)); + packet[9+i+2]=chan_1>>4; + } + +<<<<<<< HEAD + packet[21] = (FrX_receive_seq << 4) | FrX_send_seq ;//8 at start +======= + packet[21] = seq_last_sent << 4 | seq_last_rcvd;//8 at start + if (seq_last_sent < 0x08 && seq_last_rcvd < 8) + seq_last_sent = (seq_last_sent + 1) % 4; + else if (seq_last_rcvd == 0x00) + seq_last_sent = 1; + else + seq_last_rcvd = 8; +>>>>>>> dd3f8b4717c03dc2f86701191dc8b265d4706751 + + if(sub_protocol & 1 )// in X8 mode send only 8ch every 9ms + lpass = 0 ; + else + lpass += 1 ; + + uint8_t limit = (sub_protocol & 2 ) ? 31 : 28 ; + for (uint8_t i=22;i>8;//high byte + packet[limit]=lcrc;//low byte +} + +uint16_t ReadFrSkyX() +{ + switch(state) + { + default: + set_start(47); + CC2500_SetPower(); + CC2500_Strobe(CC2500_SFRX); + // + frskyX_build_bind_packet(); + CC2500_Strobe(CC2500_SIDLE); + CC2500_WriteData(packet, packet[0]+1); + if(IS_BIND_DONE_on) + state = FRSKY_BIND_DONE; + else + state++; + return 9000; + case FRSKY_BIND_DONE: + initialize_data(0); + hopping_frequency_no=0; + BIND_DONE; + state++; + break; + case FRSKY_DATA1: + if ( prev_option != option ) + { + CC2500_WriteReg(CC2500_0C_FSCTRL0,option); // Frequency offset hack + prev_option = option ; + } + CC2500_SetTxRxMode(TX_EN); + set_start(hopping_frequency_no); + CC2500_SetPower(); + CC2500_Strobe(CC2500_SFRX); + hopping_frequency_no = (hopping_frequency_no+chanskip)%47; + CC2500_Strobe(CC2500_SIDLE); + CC2500_WriteData(packet, packet[0]+1); + // +// frskyX_data_frame(); + state++; + return 5200; + case FRSKY_DATA2: + CC2500_SetTxRxMode(RX_EN); + CC2500_Strobe(CC2500_SIDLE); + state++; + return 200; + case FRSKY_DATA3: + CC2500_Strobe(CC2500_SRX); + state++; + return 3100; + case FRSKY_DATA4: + len = CC2500_ReadReg(CC2500_3B_RXBYTES | CC2500_READ_BURST) & 0x7F; + if (len && (len<=(0x0E + 3))) //Telemetry frame is 17 + { + packet_count=0; + CC2500_ReadData(pkt, len); + #if defined TELEMETRY + frsky_check_telemetry(pkt,len); //check if valid telemetry packets + //parse telemetry packets here + //The same telemetry function used by FrSky(D8). + #endif + } + else + { + packet_count++; + // restart sequence on missed packet - might need count or timeout instead of one missed + if(packet_count>100) + {//~1sec +// seq_last_sent = 0; +// seq_last_rcvd = 8; + FrX_send_seq = 0x08 ; +// FrX_receive_seq = 0 ; + packet_count=0; + #if defined TELEMETRY + telemetry_lost=1; + #endif + } + CC2500_Strobe(CC2500_SFRX); //flush the RXFIFO + } + frskyX_data_frame(); + if ( FrX_send_seq != 0x08 ) + { + FrX_send_seq = ( FrX_send_seq + 1 ) & 0x03 ; + } + state = FRSKY_DATA1; + return 500; + } + return 1; +} + +uint16_t initFrSkyX() +{ + set_rx_tx_addr(MProtocol_id_master); + Frsky_init_hop(); + packet_count=0; + while(!chanskip) + chanskip=random(0xfefefefe)%47; + + //for test*************** + //rx_tx_addr[3]=0xB3; + //rx_tx_addr[2]=0xFD; + //************************ + frskyX_init(); + // + if(IS_AUTOBIND_FLAG_on) + { + state = FRSKY_BIND; + initialize_data(1); + } + else + { + state = FRSKY_DATA1; + initialize_data(0); + } +// seq_last_sent = 0; +// seq_last_rcvd = 8; + FrX_send_seq = 0x08 ; + FrX_receive_seq = 0 ; + return 10000; +} +#endif \ No newline at end of file diff --git a/Multiprotocol/Multi.txt b/Multiprotocol/Multi.txt index a9c1fd8..9d499cf 100644 --- a/Multiprotocol/Multi.txt +++ b/Multiprotocol/Multi.txt @@ -11,7 +11,7 @@ 11,SLT,SLT,VISTA 12,CX10,GREEN,BLUE,DM007,---,J3015_1,J3015_2,MK33041 13,CG023,CG023,YD829,H8_3D -14,Bayang,Bayang,H8S3D +14,Bayang,Bayang,H8S3D,X16_AH 15,FrskyX,CH_16,CH_8,EU_16,EU_8 16,ESky 17,MT99xx,MT,H7,YZ,LS,FY805 diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index c7173e4..e161833 100644 --- a/Multiprotocol/Multiprotocol.h +++ b/Multiprotocol/Multiprotocol.h @@ -19,7 +19,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 1 #define VERSION_REVISION 6 -#define VERSION_PATCH_LEVEL 21 +#define VERSION_PATCH_LEVEL 23 //****************** // Protocols //****************** @@ -136,7 +136,8 @@ enum CG023 enum BAYANG { BAYANG = 0, - H8S3D = 1 + H8S3D = 1, + X16_AH = 2, }; enum MT99XX { @@ -393,7 +394,7 @@ enum CC2500_POWER CC2500_POWER_16 = 0xFE, // 0dbm CC2500_POWER_17 = 0xFF // +1dbm }; -#define CC2500_HIGH_POWER CC2500_POWER_16 +#define CC2500_HIGH_POWER CC2500_POWER_17 #define CC2500_LOW_POWER CC2500_POWER_13 #define CC2500_RANGE_POWER CC2500_POWER_1 #define CC2500_BIND_POWER CC2500_POWER_1 @@ -537,6 +538,7 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p -- sub_protocol==BAYANG BAYANG 0 H8S3D 1 + X16_AH 2 sub_protocol==MT99XX MT99 0 H7 1 @@ -678,4 +680,4 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p -- data[0] = RSSI value data[1-28] telemetry data -*/ \ No newline at end of file +*/ diff --git a/Multiprotocol/Multiprotocol.ino b/Multiprotocol/Multiprotocol.ino index 83f0d8d..02623e7 100644 --- a/Multiprotocol/Multiprotocol.ino +++ b/Multiprotocol/Multiprotocol.ino @@ -23,6 +23,9 @@ #include //#define DEBUG_TX //#define USE_MY_CONFIG +#ifdef ARDUINO_AVR_XMEGA32D4 +#include "MultiOrange.h" +#endif #include "Multiprotocol.h" //Multiprotocol module configuration file @@ -106,6 +109,18 @@ uint8_t RX_num; uint8_t calData[48]; #endif +#ifdef CHECK_FOR_BOOTLOADER + uint8_t BootTimer ; + uint8_t BootState ; + uint8_t NotBootChecking ; + uint8_t BootCount ; + + #define BOOT_WAIT_30_IDLE 0 + #define BOOT_WAIT_30_DATA 1 + #define BOOT_WAIT_20 2 + #define BOOT_READY 3 +#endif + //Channel mapping for protocols const uint8_t CH_AETR[]={AILERON, ELEVATOR, THROTTLE, RUDDER, AUX1, AUX2, AUX3, AUX4, AUX5, AUX6, AUX7, AUX8, AUX9, AUX10}; const uint8_t CH_TAER[]={THROTTLE, AILERON, ELEVATOR, RUDDER, AUX1, AUX2, AUX3, AUX4, AUX5, AUX6, AUX7, AUX8}; @@ -154,7 +169,7 @@ uint8_t pkt[MAX_PKT];//telemetry receiving packets uint8_t pktt[MAX_PKT];//telemetry receiving packets #ifdef BASH_SERIAL // For bit-bashed serial output - #define TXBUFFER_SIZE 128 + #define TXBUFFER_SIZE 192 volatile struct t_serial_bash { uint8_t head ; @@ -164,7 +179,7 @@ uint8_t pkt[MAX_PKT];//telemetry receiving packets uint8_t speed ; } SerialControl ; #else - #define TXBUFFER_SIZE 64 + #define TXBUFFER_SIZE 96 volatile uint8_t tx_buff[TXBUFFER_SIZE]; volatile uint8_t tx_head=0; volatile uint8_t tx_tail=0; @@ -392,7 +407,11 @@ void setup() protocol=0; servo_max_100=SERIAL_MAX_100; servo_min_100=SERIAL_MIN_100; servo_max_125=SERIAL_MAX_125; servo_min_125=SERIAL_MIN_125; - Mprotocol_serial_init(); // Configure serial and enable RX interrupt + #ifdef CHECK_FOR_BOOTLOADER + Mprotocol_serial_init(1); // Configure serial and enable RX interrupt + #else + Mprotocol_serial_init(); // Configure serial and enable RX interrupt + #endif #endif //ENABLE_SERIAL } servo_mid=servo_min_100+servo_max_100; //In fact 2* mid_value @@ -485,6 +504,11 @@ void loop() uint8_t Update_All() { #ifdef ENABLE_SERIAL + #ifdef CHECK_FOR_BOOTLOADER + if ( (mode_select==MODE_SERIAL) && (NotBootChecking == 0) ) + pollBoot() ; + else + #endif if(mode_select==MODE_SERIAL && IS_RX_FLAG_on) // Serial mode and something has been received { update_serial_data(); // Update protocol and data @@ -1093,7 +1117,11 @@ void modules_reset() prev_power=0xFD; // unused power value } -void Mprotocol_serial_init() +#ifdef CHECK_FOR_BOOTLOADER + void Mprotocol_serial_init( uint8_t boot ) +#else + void Mprotocol_serial_init() +#endif { #ifdef ORANGE_TX PORTC.OUTSET = 0x08 ; @@ -1103,18 +1131,41 @@ void Mprotocol_serial_init() USARTC0.BAUDCTRLB = 0 ; USARTC0.CTRLB = 0x18 ; - USARTC0.CTRLA = (USARTC0.CTRLA & 0xCF) | 0x10 ; + USARTC0.CTRLA = (USARTC0.CTRLA & 0xCC) | 0x11 ; USARTC0.CTRLC = 0x2B ; UDR0 ; #ifdef INVERT_SERIAL PORTC.PIN3CTRL |= 0x40 ; #endif + #ifdef CHECK_FOR_BOOTLOADER + if ( boot ) + { + USARTC0.BAUDCTRLB = 0 ; + USARTC0.BAUDCTRLA = 33 ; // 57600 + USARTC0.CTRLA = (USARTC0.CTRLA & 0xC0) ; + USARTC0.CTRLC = 0x03 ; // 8 bit, no parity, 1 stop + USARTC0.CTRLB = 0x18 ; // Enable Tx and Rx + PORTC.PIN3CTRL &= ~0x40 ; + } + #endif // CHECK_FOR_BOOTLOADER #elif defined STM32_BOARD - usart2_begin(100000,SERIAL_8E2); + #ifdef CHECK_FOR_BOOTLOADER + if ( boot ) + { + usart2_begin(57600,SERIAL_8N1); + USART2_BASE->CR1 &= ~USART_CR1_RXNEIE ; + (void)UDR0 ; + } + else + #endif // CHECK_FOR_BOOTLOADER + { + usart2_begin(100000,SERIAL_8E2); + USART2_BASE->CR1 |= USART_CR1_PCE_BIT; + } usart3_begin(100000,SERIAL_8E2); - USART2_BASE->CR1 |= USART_CR1_PCE_BIT; - USART3_BASE->CR1 &= ~ USART_CR1_RE;//disable - USART2_BASE->CR1 &= ~ USART_CR1_TE;//disable transmit + + USART3_BASE->CR1 &= ~ USART_CR1_RE; //disable + USART2_BASE->CR1 &= ~ USART_CR1_TE; //disable transmit #else //ATMEGA328p #include @@ -1123,7 +1174,7 @@ void Mprotocol_serial_init() UCSR0A = 0 ; // Clear X2 bit //Set frame format to 8 data bits, even parity, 2 stop bits UCSR0C = _BV(UPM01)|_BV(USBS0)|_BV(UCSZ01)|_BV(UCSZ00); - while ( UCSR0A & (1 << RXC0) )//flush receive buffer + while ( UCSR0A & (1 << RXC0) ) //flush receive buffer UDR0; //enable reception and RC complete interrupt UCSR0B = _BV(RXEN0)|_BV(RXCIE0);//rx enable and interrupt @@ -1132,9 +1183,130 @@ void Mprotocol_serial_init() initTXSerial( SPEED_100K ) ; #endif //TELEMETRY #endif //DEBUG_TX + #ifdef CHECK_FOR_BOOTLOADER + if ( boot ) + { + UBRR0H = 0; + UBRR0L = 33; // 57600 + UCSR0C &= ~_BV(UPM01); // No parity + UCSR0B &= ~_BV(RXCIE0); // No rx interrupt + UCSR0A |= _BV(U2X0); // Double speed mode USART0 + } + #endif // CHECK_FOR_BOOTLOADER #endif //ORANGE_TX } +#ifdef CHECK_FOR_BOOTLOADER +void pollBoot() +{ + uint8_t rxchar ; + uint8_t lState = BootState ; + uint8_t millisTime = millis(); // Call this once only + + #ifdef ORANGE_TX + if ( USARTC0.STATUS & USART_RXCIF_bm ) + #elif defined STM32_BOARD + if ( USART2_BASE->SR & USART_SR_RXNE ) + #else + if ( UCSR0A & ( 1 << RXC0 ) ) + #endif + { + rxchar = UDR0 ; + BootCount += 1 ; + if ( ( lState == BOOT_WAIT_30_IDLE ) || ( lState == BOOT_WAIT_30_DATA ) ) + { + if ( lState == BOOT_WAIT_30_IDLE ) // Waiting for 0x30 + BootTimer = millisTime ; // Start timeout + if ( rxchar == 0x30 ) + lState = BOOT_WAIT_20 ; + else + lState = BOOT_WAIT_30_DATA ; + } + else + if ( lState == BOOT_WAIT_20 && rxchar == 0x20 ) // Waiting for 0x20 + lState = BOOT_READY ; + } + else // No byte received + { + if ( lState != BOOT_WAIT_30_IDLE ) // Something received + { + uint8_t time = millisTime - BootTimer ; + if ( time > 5 ) + { + #ifdef STM32_BOARD + if ( BootCount > 4 ) + #else + if ( BootCount > 2 ) + #endif + { // Run normally + NotBootChecking = 0xFF ; + Mprotocol_serial_init( 0 ) ; + } + else if ( lState == BOOT_READY ) + { + #ifdef STM32_BOARD + #define SCS_BASE (0xE000E000) /*!< System Control Space Base Address */ + #define SCB_BASE (SCS_BASE + 0x0D00) /*!< System Control Block Base Address */ + #define SCB ((SCB_Type *) SCB_BASE) /*!< SCB configuration struct */ + #define __I volatile /*!< defines 'read only' permissions */ + #define __IO volatile /*!< defines 'read / write' permissions */ + typedef struct + { + __I uint32_t CPUID; /*!< Offset: 0x00 CPU ID Base Register */ + __IO uint32_t ICSR; /*!< Offset: 0x04 Interrupt Control State Register */ + __IO uint32_t VTOR; /*!< Offset: 0x08 Vector Table Offset Register */ + __IO uint32_t AIRCR; /*!< Offset: 0x0C Application Interrupt / Reset Control Register */ + __IO uint32_t SCR; /*!< Offset: 0x10 System Control Register */ + __IO uint32_t CCR; /*!< Offset: 0x14 Configuration Control Register */ + __IO uint8_t SHP[12]; /*!< Offset: 0x18 System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IO uint32_t SHCSR; /*!< Offset: 0x24 System Handler Control and State Register */ + __IO uint32_t CFSR; /*!< Offset: 0x28 Configurable Fault Status Register */ + __IO uint32_t HFSR; /*!< Offset: 0x2C Hard Fault Status Register */ + __IO uint32_t DFSR; /*!< Offset: 0x30 Debug Fault Status Register */ + __IO uint32_t MMFAR; /*!< Offset: 0x34 Mem Manage Address Register */ + __IO uint32_t BFAR; /*!< Offset: 0x38 Bus Fault Address Register */ + __IO uint32_t AFSR; /*!< Offset: 0x3C Auxiliary Fault Status Register */ + __I uint32_t PFR[2]; /*!< Offset: 0x40 Processor Feature Register */ + __I uint32_t DFR; /*!< Offset: 0x48 Debug Feature Register */ + __I uint32_t ADR; /*!< Offset: 0x4C Auxiliary Feature Register */ + __I uint32_t MMFR[4]; /*!< Offset: 0x50 Memory Model Feature Register */ + __I uint32_t ISAR[5]; /*!< Offset: 0x60 ISA Feature Register */ + } SCB_Type; + #define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */ + #define SCB_AIRCR_SYSRESETREQ_Pos 2 /*!< SCB AIRCR: SYSRESETREQ Position */ + #define SCB_AIRCR_PRIGROUP_Pos 8 /*!< SCB AIRCR: PRIGROUP Position */ + #define SCB_AIRCR_PRIGROUP_Msk (7ul << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + #define SCB_AIRCR_SYSRESETREQ_Msk (1ul << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + + // NVIC_SystemReset + SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk); /* Keep priority group unchanged */ + asm("dsb"); + while(1); /* wait until reset */ + #else + cli(); // Disable global int due to RW of 16 bits registers + void (*p)(); + #ifndef ORANGE_TX + p = (void (*)())0x3F00 ; // Word address (0x7E00 byte) + #else + p = (void (*)())0x4000 ; // Word address (0x8000 byte) + #endif + (*p)() ; // go to boot + #endif + } + else + { + lState = BOOT_WAIT_30_IDLE ; + BootCount = 0 ; + } + } + } + } + BootState = lState ; +} +#endif //CHECK_FOR_BOOTLOADER + #if defined(TELEMETRY) void PPM_Telemetry_serial_init() { diff --git a/Multiprotocol/Symax_nrf24l01.ino b/Multiprotocol/Symax_nrf24l01.ino index 3506140..b7fbb58 100644 --- a/Multiprotocol/Symax_nrf24l01.ino +++ b/Multiprotocol/Symax_nrf24l01.ino @@ -13,7 +13,6 @@ along with Multiprotocol. If not, see . */ // compatible with Syma X5C-1, X11, X11C, X12 and for sub protocol X5C Syma X5C (original), X2 -// Last sync with hexfet new_protocols/cx10_nrf24l01.c dated 2015-09-28 #if defined(SYMAX_NRF24L01_INO) @@ -30,6 +29,7 @@ #define SYMAX_FLAG_VIDEO 0x02 #define SYMAX_FLAG_PICTURE 0x04 #define SYMAX_FLAG_HEADLESS 0x08 +#define SYMAX_XTRM_RATES 0x10 #define SYMAX_PAYLOADSIZE 10 // receive data pipes set to this size, but unused #define SYMAX_MAX_PACKET_LENGTH 16 // X11,X12,X5C-1 10-byte, X5C 16-byte @@ -58,6 +58,7 @@ static void __attribute__((unused)) SYMAX_read_controls() { // Protocol is registered AETRF, that is // Aileron is channel 1, Elevator - 2, Throttle - 3, Rudder - 4, Flip control - 5 + // Extended (trim-added) Rates - 6, Photo - 7, Video - 8, Headless - 9 aileron = convert_channel_s8b(AILERON); elevator = convert_channel_s8b(ELEVATOR); throttle = convert_channel_8b(THROTTLE); @@ -67,6 +68,9 @@ static void __attribute__((unused)) SYMAX_read_controls() // Channel 5 if (Servo_AUX1) flags = SYMAX_FLAG_FLIP; + // Channel 6 + if (Servo_AUX2) + flags |= SYMAX_XTRM_RATES; // Channel 7 if (Servo_AUX3) flags |= SYMAX_FLAG_PICTURE; @@ -75,7 +79,10 @@ static void __attribute__((unused)) SYMAX_read_controls() flags |= SYMAX_FLAG_VIDEO; // Channel 9 if (Servo_AUX5) + { flags |= SYMAX_FLAG_HEADLESS; + flags &= ~SYMAX_XTRM_RATES; // Extended rates & headless incompatible + } } #define X5C_CHAN2TRIM(X) ((((X) & 0x80 ? 0xff - (X) : 0x80 + (X)) >> 2) + 0x20) @@ -98,9 +105,18 @@ static void __attribute__((unused)) SYMAX_build_packet_x5c(uint8_t bind) packet[1] = rudder; packet[2] = elevator ^ 0x80; // reversed from default packet[3] = aileron; - packet[4] = X5C_CHAN2TRIM(rudder ^ 0x80);// drive trims for extra control range - packet[5] = X5C_CHAN2TRIM(elevator); - packet[6] = X5C_CHAN2TRIM(aileron ^ 0x80); + if (flags & SYMAX_XTRM_RATES) + { // drive trims for extra control range + packet[4] = X5C_CHAN2TRIM(rudder ^ 0x80); + packet[5] = X5C_CHAN2TRIM(elevator); + packet[6] = X5C_CHAN2TRIM(aileron ^ 0x80); + } + else + { + packet[4] = 0x00; + packet[5] = 0x00; + packet[6] = 0x00; + } packet[7] = 0xae; packet[8] = 0xa9; packet[9] = 0x00; @@ -138,9 +154,15 @@ static void __attribute__((unused)) SYMAX_build_packet(uint8_t bind) packet[2] = rudder; packet[3] = aileron; packet[4] = (flags & SYMAX_FLAG_VIDEO ? 0x80 : 0x00) | (flags & SYMAX_FLAG_PICTURE ? 0x40 : 0x00); - packet[5] = (elevator >> 2) | 0xc0; //always high rates (bit 7 is rate control) - packet[6] = (rudder >> 2) | (flags & SYMAX_FLAG_FLIP ? 0x40 : 0x00); - packet[7] = (aileron >> 2) | (flags & SYMAX_FLAG_HEADLESS ? 0x80 : 0x00); + packet[5] = 0xc0; //always high rates (bit 7 is rate control) + packet[6] = flags & SYMAX_FLAG_FLIP ? 0x40 : 0x00; + packet[7] = flags & SYMAX_FLAG_HEADLESS ? 0x80 : 0x00; + if (flags & SYMAX_XTRM_RATES) + { // use trims to extend controls + packet[5] |= elevator >> 2; + packet[6] |= rudder >> 2; + packet[7] |= aileron >> 2; + } packet[8] = 0x00; } packet[9] = SYMAX_checksum(packet); diff --git a/Multiprotocol/Telemetry.ino b/Multiprotocol/Telemetry.ino index 947b118..e91413b 100644 --- a/Multiprotocol/Telemetry.ino +++ b/Multiprotocol/Telemetry.ino @@ -31,6 +31,34 @@ uint8_t RetrySequence ; uint8_t sport_counter=0; uint8_t RxBt = 0; uint8_t sport = 0; +#define MAX_PKTX 10 +#define FX_BUFFERS 4 +uint8_t pktx[MAX_PKTX]; +uint8_t pktx1[FRSKY_SPORT_PACKET_SIZE*FX_BUFFERS]; +uint8_t indx; +//struct t_fx_rx_packet +//{ +// uint8_t validSequence ; +// uint8_t count ; +// uint8_t payload[6] ; +//} ; + +// Store for out of sequence packet +//struct t_fx_rx_packet FrskyxRxTelemetry ; + +uint8_t FrskyxRxTelemetryValidSequence ; + +struct t_fx_rx_frame +{ + uint8_t valid ; + uint8_t count ; + uint8_t payload[6] ; +} ; + +// Store for FrskyX telemetry +struct t_fx_rx_frame FrskyxRxFrames[4] ; +uint8_t NextFxFrameToForward ; + #endif #if defined HUB_TELEMETRY #define USER_MAX_BYTES 6 @@ -40,10 +68,6 @@ uint8_t RetrySequence ; #define START_STOP 0x7e #define BYTESTUFF 0x7d #define STUFF_MASK 0x20 -#define MAX_PKTX 10 -uint8_t pktx[MAX_PKTX]; -uint8_t pktx1[MAX_PKTX]; -uint8_t indx; uint8_t frame[18]; #if ( defined(MULTI_TELEMETRY) || defined(MULTI_STATUS) ) @@ -155,7 +179,8 @@ void frskySendStuffed() void frsky_check_telemetry(uint8_t *pkt,uint8_t len) { - if(pkt[1] == rx_tx_addr[3] && pkt[2] == rx_tx_addr[2] && len ==(pkt[0] + 3)) + uint8_t clen = pkt[0] + 3 ; + if(pkt[1] == rx_tx_addr[3] && pkt[2] == rx_tx_addr[2] && len == clen ) { telemetry_link|=1; // Telemetry data is available /*previous version @@ -205,19 +230,144 @@ void frsky_check_telemetry(uint8_t *pkt,uint8_t len) telemetry_lost=0; if (protocol==MODE_FRSKYX) { - if ((pktt[5] >> 4 & 0x0f) == 0x08) - { - seq_last_sent = 8; - seq_last_rcvd = 0; - pass=0; - } - else + uint16_t lcrc = crc_x(&pkt[3], len-7 ) ; +// if ( ( sub_protocol & 2 ) == 0 ) +// { +// if ( ( (lcrc >> 8) == pkt[len-4]) && ( (lcrc & 0x00FF ) == pkt[len-3]) ) +// { +// lcrc = 0 ; +// } +// else +// { +// lcrc = 1 ; +// } +// } +// if ( lcrc == 0 ) + + if ( ( (lcrc >> 8) == pkt[len-4]) && ( (lcrc & 0x00FF ) == pkt[len-3]) ) { - if ((pktt[5] >> 4 & 0x03) == (seq_last_rcvd + 1) % 4) - seq_last_rcvd = (seq_last_rcvd + 1) % 4; + // Check if in sequence + if ( (pkt[5] & 0x0F) == 0x08 ) + { + FrX_receive_seq = 0x08 ; + NextFxFrameToForward = 0 ; + FrskyxRxFrames[0].valid = 0 ; + FrskyxRxFrames[1].valid = 0 ; + FrskyxRxFrames[2].valid = 0 ; + FrskyxRxFrames[3].valid = 0 ; + } + else if ( (pkt[5] & 0x03) == (FrX_receive_seq & 0x03 ) ) + { + // OK to process + struct t_fx_rx_frame *p ; + uint8_t count ; + p = &FrskyxRxFrames[FrX_receive_seq & 3] ; + count = pkt[6] ; + if ( count <= 6 ) + { + p->count = count ; + for ( uint8_t i = 0 ; i < count ; i += 1 ) + { + p->payload[i] = pkt[i+7] ; + } + } + else + { + p->count = 0 ; + } + p->valid = 1 ; + + + + FrX_receive_seq = ( FrX_receive_seq + 1 ) & 0x03 ; + + if ( FrskyxRxTelemetryValidSequence & 0x80 ) + { + FrX_receive_seq = ( FrskyxRxTelemetryValidSequence + 1 ) & 3 ; + FrskyxRxTelemetryValidSequence &= 0x7F ; + } + +// if ( FrskyxRxTelemetry.validSequence & 0x80 ) +// { +// FrX_receive_seq = ( FrskyxRxTelemetry.validSequence + 1 ) & 3 ; + +// FrskyxRxTelemetry.validSequence &= 0x7F ; + +// } + } else - pass=0;//reset if sequence wrong + { + // Save and request correct packet +// struct t_fx_rx_packet *p ; + struct t_fx_rx_frame *q ; + uint8_t count ; + // pkt[4] RSSI + // pkt[5] sequence control + // pkt[6] payload count + // pkt[7-12] payload + pktt[6] = 0 ; // Don't process + if ( (pkt[5] & 0x03) == ( ( FrX_receive_seq +1 ) & 3 ) ) + { + q = &FrskyxRxFrames[(pkt[5] & 0x03)] ; + count = pkt[6] ; + if ( count <= 6 ) + { + q->count = count ; + for ( uint8_t i = 0 ; i < count ; i += 1 ) + { + q->payload[i] = pkt[i+7] ; + } + } + else + { + q->count = 0 ; + } + q->valid = 1 ; + + FrskyxRxTelemetryValidSequence = 0x80 | ( pkt[5] & 0x03 ) ; + } + + +// p = &FrskyxRxTelemetry ; +// count = pkt[6] ; +// if ( count <= 6 ) +// { +// p->count = count ; +// for ( uint8_t i = 0 ; i < count ; i += 1 ) +// { +// p->payload[i] = pkt[i+7] ; +// } +// p->validSequence = 0x80 | ( pkt[5] & 0x03 ) ; +// } + FrX_receive_seq = ( FrX_receive_seq & 0x03 ) | 0x04 ; // Request re-transmission + } + + if (((pktt[5] >> 4) & 0x0f) == 0x08) + { + FrX_send_seq = 0 ; +// FrX_receive_seq = 0x08 ; + } } + +// packet[21] = (FrX_receive_seq << 4) | FrX_send_seq ;//8 at start +// if ( FrX_send_seq != 0x08 ) +// { +// FrX_send_seq = ( FrX_send_seq + 1 ) & 0x03 ; +// } + +// if ((pktt[5] >> 4 & 0x0f) == 0x08) +// { +// seq_last_sent = 8; +// seq_last_rcvd = 0; +// pass=0; +// } +// else +// { +// if ((pktt[5] >> 4 & 0x03) == (seq_last_rcvd + 1) % 4) +// seq_last_rcvd = (seq_last_rcvd + 1) % 4; +// else +// pass=0;//reset if sequence wrong +// } } #endif } @@ -363,12 +513,25 @@ pkt[6]|(counter++)|00 01 02 03 04 05 06 07 08 09 0x34 0x0A 0xC3 0x56 0xF3 */ + +const uint8_t PROGMEM Indices[] = { 0x00, 0xA1, 0x22, 0x83, 0xE4, 0x45, + 0xC6, 0x67, 0x48, 0xE9, 0x6A, 0xCB, + 0xAC, 0x0D, 0x8E, 0x2F, 0xD0, 0x71, + 0xF2, 0x53, 0x34, 0x95, 0x16, 0xB7, + 0x98, 0x39, 0xBA, 0x1B } ; + + #ifdef MULTI_TELEMETRY void sportSend(uint8_t *p) { multi_send_header(MULTI_TELEMETRY_SPORT, 9); uint16_t crc_s = 0; - Serial_write(p[0]) ; + uint8_t x = p[0] ; + if ( x <= 0x1B ) + { + x = pgm_read_byte_near( &Indices[x] ) ; + } + Serial_write(x) ; for (uint8_t i = 1; i < 9; i++) { if (i == 8) @@ -462,7 +625,13 @@ void sportSendFrame() { for (i=0;i= FRSKY_SPORT_PACKET_SIZE) {//8 bytes no crc - if ( sport ) - { - // overrun! - } - else + if ( sport < FX_BUFFERS ) { + uint8_t dest = sport * FRSKY_SPORT_PACKET_SIZE ; uint8_t i ; for ( i = 0 ; i < FRSKY_SPORT_PACKET_SIZE ; i += 1 ) { - pktx1[i] = pktx[i] ; // Double buffer + pktx1[dest++] = pktx[i] ; // Triple buffer } - sport = 1;//ok to send + sport += 1 ;//ok to send } +// else +// { +// // Overrun +// } pass = 0;//reset } } @@ -534,11 +704,14 @@ void TelemetryUpdate() h = SerialControl.head ; t = SerialControl.tail ; if ( h >= t ) - t += 128 - h ; + t += 192 - h ; else t -= h ; +// if ( t < 32 ) if ( t < 64 ) + { return ; + } #else uint8_t h ; uint8_t t ; @@ -549,7 +722,9 @@ void TelemetryUpdate() else t -= h ; if ( t < 32 ) + { return ; + } #endif #if ( defined(MULTI_TELEMETRY) || defined(MULTI_STATUS) ) { @@ -566,15 +741,62 @@ void TelemetryUpdate() #if defined SPORT_TELEMETRY if (protocol==MODE_FRSKYX) { // FrSkyX +// struct t_fx_rx_frame *p ; +// uint8_t count ; + + for(;;) + { + struct t_fx_rx_frame *p ; + uint8_t count ; + p = &FrskyxRxFrames[NextFxFrameToForward] ; + if ( p->valid ) + { + count = p->count ; + for (uint8_t i=0; i < count ; i++) + proces_sport_data(p->payload[i]) ; + p->valid = 0 ; // Sent on + NextFxFrameToForward = ( NextFxFrameToForward + 1 ) & 3 ; + } + else + { + break ; + } + } + +// p = &FrskyxRxFrames[NextFxFrameToForward] ; +// if ( p->valid ) +// { +// count = p->count ; +// for (uint8_t i=0; i < count ; i++) +// proces_sport_data(p->payload[i]) ; +// p->valid = 0 ; // Sent on +// NextFxFrameToForward = ( NextFxFrameToForward + 1 ) & 3 ; +// } + if(telemetry_link) { if(pktt[4] & 0x80) RX_RSSI=pktt[4] & 0x7F ; else RxBt = (pktt[4]<<1) + 1 ; - if(pktt[6] && pktt[6]<=6) - for (uint8_t i=0; i < pktt[6]; i++) - proces_sport_data(pktt[7+i]); + +// if(pktt[6] && pktt[6]<=6) +// { +// for (uint8_t i=0; i < pktt[6]; i++) +// proces_sport_data(pktt[7+i]); +// if ( FrskyxRxTelemetry.validSequence & 0x80 ) +// { +// // Process out of sequence packet +// for (uint8_t i=0; i < FrskyxRxTelemetry.count ; i++) +// { +// proces_sport_data( FrskyxRxTelemetry.payload[i] ) ; +// } +//// FrX_receive_seq = ( FrskyxRxTelemetry.validSequence + 1 ) & 3 ; +// FrskyxRxTelemetry.validSequence = 0 ; +// } +// } + + telemetry_link=0; } uint32_t now = micros(); @@ -928,7 +1150,13 @@ ISR(TIMER0_COMPB_vect) { GPIOR0 = ptr->data[ptr->tail] ; GPIOR2 = ptr->data[ptr->tail+1] ; - ptr->tail = ( ptr->tail + 2 ) & 0x7F ; + uint8_t nextTail ; + nextTail = ptr->tail + 2 ; + if ( nextTail > 192 ) + { + nextTail = 0 ; + } + ptr->tail = nextTail ; GPIOR1 = 8 ; OCR0A = OCR0B + 40 ; OCR0B = OCR0A + 8 * 20 ; diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h index 513ca8b..98645b7 100644 --- a/Multiprotocol/_Config.h +++ b/Multiprotocol/_Config.h @@ -49,6 +49,13 @@ //The goal is to prevent binding other people's model when powering up the TX, changing model or scanning through protocols. #define WAIT_FOR_BIND +/*************************/ +/*** BOOTLOADER USE ***/ +/*************************/ +//Allow flashing multimodule directly with TX(erky9x or opentx modified firmwares) +//Check https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/tree/master/BootLoaders +//To enable this feature remove the "//" on the next line. +//#define CHECK_FOR_BOOTLOADER /****************/ /*** RF CHIPS ***/ @@ -87,7 +94,6 @@ //Default is commented, you should uncoment only for test purpose or if you know exactly what you are doing!!! //#define FORCE_CYRF_ID "\x12\x34\x56\x78\x9A\xBC" - /****************************/ /*** PROTOCOLS TO INCLUDE ***/ /****************************/ @@ -134,6 +140,42 @@ #define GW008_NRF24L01_INO #define DM002_NRF24L01_INO +/**************************/ +/*** FAILSAFE SETTINGS ***/ +/**************************/ +#define AFHDS2A_FAILSAFE +#ifdef AFHDS2A_FAILSAFE +/* + Failsafe Min/Max values 962 <-> 2038 +*/ +const int8_t AFHDS2AFailsafeMIN = -105; +const int8_t AFHDS2AFailsafeMAX = 105; +// +const int8_t AFHDS2AFailsafe[14]= { +/* + Failsafe examples + 988 <-> 2012µs -100% = 988 = 1500 + (2012-988)/2 * (-100/100) = 1500 - 512 = 988 + 988 <-> 2012µs 0% = 1500 = 1500 + (2012-988)/2 * ( 0/100) = 1500 + 0 = 1500 + 988 <-> 2012µs 100% = 2012 = 1500 + (2012-988)/2 * ( 100/100) = 1500 + 512 = 2012 + 988 <-> 2012µs -105% = 962 = 1500 + (2012-988)/2 * (-105/100) = 1500 - 538 = 962 +*/ +/* ch 1 */ -1, +/* ch 2 */ -1, +/* ch 3 */ -105, +/* ch 4 */ -1, +/* ch 5 */ -1, +/* ch 6 */ -1, +/* ch 7 */ -1, +/* ch 8 */ -1, +/* ch 9 */ -1, +/* ch 10 */ -1, +/* ch 11 */ -1, +/* ch 12 */ -1, +/* ch 13 */ -1, +/* ch 14 */ -1 +}; +#endif + /**************************/ /*** TELEMETRY SETTINGS ***/ /**************************/ @@ -178,7 +220,6 @@ //If you do not plan to use the Serial mode comment this line using "//" to save Flash space #define ENABLE_SERIAL - /*************************/ /*** PPM MODE SETTINGS ***/ /*************************/ @@ -305,6 +346,7 @@ const PPM_Parameters PPM_prot[15]= { MODE_BAYANG BAYANG H8S3D + X16_AH MODE_ESKY NONE MODE_MT99XX diff --git a/Protocols_Details.md b/Protocols_Details.md index b273322..cc4b91d 100644 --- a/Protocols_Details.md +++ b/Protocols_Details.md @@ -361,9 +361,9 @@ Models: EAchine H8(C) mini, BayangToys X6/X7/X9, JJRC JJ850, Floureon H101 ... Autobind protocol -CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10 ----|---|---|---|---|---|---|---|---|---- -A|E|T|R|FLIP|RTH|PICTURE|VIDEO|HEADLESS|INVERTED +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11 +---|---|---|---|---|---|---|---|---|----|--- +A|E|T|R|FLIP|RTH|PICTURE|VIDEO|HEADLESS|INVERTED|TAKE_OFF ### Sub_protocol BAYANG - *0* Option=0 -> normal Bayang protocol @@ -375,6 +375,11 @@ Model: H8S 3D Same channels assignement as above. +### Sub_protocol X16_AH - *2* +Model: X16 AH + +Same channels assignement as above. + ## DM002 - *33* Autobind protocol @@ -663,7 +668,7 @@ Autobind protocol CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9 ---|---|---|---|---|---|---|---|--- -A|E|T|R|FLIP||PICTURE|VIDEO|HEADLESS +A|E|T|R|FLIP|RATES|PICTURE|VIDEO|HEADLESS ### Sub_protocol SYMAX - *0* Models: Syma X5C-1/X11/X11C/X12 diff --git a/docs/Compiling_STM32.md b/docs/Compiling_STM32.md new file mode 100644 index 0000000..103b7ed --- /dev/null +++ b/docs/Compiling_STM32.md @@ -0,0 +1,137 @@ +# Compliling and Programming (STM32) + +**If you are Compling for the Arduino ATmega328p version of the Multiprotocol Module please go to the dedicated [Compiling and Programming ATmega328](Compiling.md) page.** + +## IMPORTANT NOTE: +Multiprotocol source can be compiled using the Arduino IDE using STM32 Core (Maple) and Arduino ARM-Cortex-M3 libraries. +On all modules with STM32F103 microcontroller, the program flash memory on the microcontroller is large enough to accommodate all the protocols. You do not have to make choices on which protocols to upload. Also, it is likely that you used the Banggood 4-in-1 RF module and you will therefore have access to all the RF modules.Now for programmng multimodule with STM32 chip you have 2 options presented below. + +1. Compiling and flashing in Arduino IDE. +1. Flashing precompiled binaries from [here](https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/releases) + - If using one of these TX with multimodule like Turnigy 9X,9XR,9X+ the binary file for flashing is **Multiprotocol_V1.X.X_STM32.bin**. + - If using TARANIS TX the binary file is **Multiprotocol_V1.X.X_STM32_INV.bin** + +Flashing precompiled **binaries** is done very simple with the cable setup presented below and an utility(GUI) **ST Flash Loader Demonstrator.** + +## Compiling source and flashing in Arduino. + +### Install the Arduino IDE and the Multiprotocol project +1. Download the Arduino IDE. The currently supported Arduino version is 1.6.11 available for [Windows]( https://www.arduino.cc/download_handler.php?f=/arduino-1.6.12-windows.exe) and [Mac OSX](http://arduino.cc/download_handler.php?f=/arduino-1.6.12-macosx.zip) +1. It is recommended to upgrade Java to the [latest version](https://www.java.com/en/download/) +1. Download the [STM32 Core](https://github.com/rogerclarkmelbourne/Arduino_STM32/archive/master.zip) and copy the Arduino_STM32 folder to: + - OSX: ```Arduino.app/Contents/Java/hardware``` (you can open Arduino.app by Ctl Clicking on Arduino.app and selecting "Show Package Contents") + - Windows: ```C:\Program Files (x86)\Arduino\hardware``` + - Make sure the folder tree structure is like this .....\hardware\Arduino_STM32\.....and **NOT** ...... \hardware\Arduino_STM32-master\Arduino_STM32-master\......So move the folders /rename accordingly. +1. Download the zip file with the Multiprotocol module source code from [here](https://github.com/pascallanger/DIY-Multiprotocol-TX-Module) +1. Unzip and copy the source code folder ```Multiprotocol``` to a folder of your choosing +1. Click on the ```Multiprotocol.ino file``` in the ```Multiprotocol``` folder and the Arduino environment should appear and the Multiprotocol project will be loaded. + +### Prepare the Arduino IDE: + +1. In order to compile successfully you need also to modify a maple library file. In ```....\hardware\Arduino_STM32\STM32F1\cores\maple\libmaple\usart_f1.c``` comment out the 2 functions as shown below. This is required to have low-level access to the USART interrupt.
+ ``` + /* void __irq_usart2(void){ + usart_irq(&usart2_rb, USART2_BASE); + } + + void __irq_usart3(void) { + usart_irq(&usart3_rb, USART3_BASE); + } */ + ``` +1. Run the IDE, and on the **Tools** menu, select **Board** and then **Boards manager**.
Click on the Arduino DUE (32 Bits ARM-Cortex M3) from the list of available boards. You must do this step, it installs the arm-none-eabi-g++ toolchain! +1. Close and reopen the Arduino IDE and load the Multiprotocol project. +1. In arduino IDE under the **Tools** -> **Board:** select the **Generic STM32F103C series** board +1. Click on the **Verify** button to test compile the before you make any changes.
If there are any errors check the process above and be sure to have the right version of the Arduino IDE.The binary file generated location is presented at the bottom of Arduino IDE compiling window.Now continue with flashing procedure. + + +### Flashing the multimodule + +There are three options for flashing the firmware. But We will present here only 3 methods ,the 4-th one is presented in advanced topics. +The first (and strongly recommended) is flashing it while it is plugged into and powered by the transmitter.The second is preparing the board for flashing with a USB cable. +The second method is definitely the easiest in the long-term, but it does require the USB bord and setting up the bootloader on the STM32 MCU. +The third method is also highly recommended and involving flashing using TX (firmware).At this methid is available for 9X ,9X pro ,Taranis with ersky9X fimrware. + +#### Option 1: Flashing with Tx power(highly recommended) + +1. Put the module in the Tx +1. Place a jumper over the BOOT0 pins.Skip this one if you made your own cable for flashing ,see below. +1. Connect your 3.3V/5V FTDI cable (USB - TTL serial) to Multiprotocol serial port.
Connect only RX, TX and GND. **Do not connect the 5V or 3.3V between the FTDI cable and the module - the power will be supplied by the transmitter**. Connect the pins as follows: + - Module RX pin to FTDI TX pin + - Module TX pin to FTDI Rx pin + - Module GND to FTDI GND +1. In arduino IDE under the **Tools** -> **Board:** check that you have selected the **Generic STM32F103C series** board +1. Under **Tools** -> **Upload Method:** select **Serial** +1. Click "Upload" and the sketch will be uploaded normally. This is valid for all arduino versions. +1. Once the firmware has uploaded, remove the BOOT0 jumper. + +If you have the module inside a box and to be inserted in TX bay, you may build a flashing cable like in the picture below. +You can attach and solder a 5 pin header female and top outside the box.**ALways insert first the USB serial device in USB port , and TX start after.** + + + +See below my module for reference + + + +#### Option 2: Flashing with USB cable. + +This method use USB connector on the STM32 V1.0 board or on the maple clone board. +1. Install first maple USB driver by running the batch file found in Arduino STM32 package folder ```..\hardware\Arduino_STM32\drivers\win\install_drivers.bat``` +1. Download the free STM32 flash loader demonstrator from [ST.com](http://www.st.com/en/development-tools/flasher-stm32.html) and using a USB-TTL device (like FTDI cable) flash the STM32duino bootloader available from Roger Clark's great STM32 site [here](https://github.com/rogerclarkmelbourne/STM32duino-bootloader/tree/master/STM32F1/binaries) .Use bootloader **generic_boot20_pa1.bin** +1. Open Arduino IDE,browse to multiprotocol folder,load the sketch multiprotocol.ino.Select the serial COM port(see notes below) +1. In Arduino IDE under "Upload method" select **STM32duino**-bootloader.Click upload ,wait until upload is complete. + +Notes: +- When you use multiSTM32_USB for the first time,the USB drivers are not recognized and com port is not open/recognized(arduino IDE port selection is grey/unavailable). After this first time use, any subsequent update of the program, you'll have to select the correct serial port and upload sketches normally in Arduino using USB port. +- More explanations how all these work you find [here](http://www.stm32duino.com/viewtopic.php?f=32&t=1774_) +- If the initial upload fails, make sure you are running the latest [Java version](https://www.java.com/en/download/) +- If using Banggood multiSTM32_USB module, follow instructions from step1(USB drivers on your computer) and jump after, to step 3(most probably generic bootloader is installed on multi module and no need to be installed again).I don't have one for test so this is an educated guess. +<<<<<<< HEAD +<<<<<<< HEAD + +#### Option 3: Flashing with TX radio(firmware) +1. Flash new STM32 bootloader(StmBoot) on multimodule.You have 2 options here.You can use one or the other. + +- Flash precompiled binary **StmBoot.ino.generic_stm32f103c** using **ST Flash loader demonstrator** and USB serial device(FTDI) , with same custom cable presented above.This process is the same as flashing with precompiled binaries.For BG(green) module you can folow the paper instructions for flashing coming with the module using bridge pins provided. +- Or you can compile Stmboot files yourself ,**Stmboot.ino** file using arduino IDE ,select Tools ,Upload method : **"Serial"** and press upload button.All this setup is using the same custom cable and USB-serial device(FTDI) as before. +- After this process is complete switch off TX,remove cables FTDI serila device and/or mutimodule jumper used for flashing.The multimodule should be back inthe same state as before. + +1. Compile multiprotocol source in arduino IDE ,choose this time Upload method **STM32duino bootloader** ,select **"Export compiled Binary"** to show the binary file in the same folder as source. +1. Take copy of the resulted binary file, to TX radio SD card ,the firmware folder. +1. Now flash the TX radio with the last firmware(for ersky9x is version P221 "e2" test version or higher). +1. Enter in TX radio maintenance mode(for ersky9X start TX radio with both bottom trims pushed outwards).Select **Update multi** press menu button select also the right com port,update ,then the multiprotocol.bin file (see the correct name) and press menu and again for flashing. You'll see a bar fill slowly .Wait for the procces to be complete.Press exit( or switch off TX) several times to come out of the maintenace mode. +1. Any subsequent update of the multiprotocol will follow 2-3 and 5-6 steps.There is no need anymore USB serial device or cables for flashing. +======= +>>>>>>> dd3f8b4717c03dc2f86701191dc8b265d4706751 +======= +>>>>>>> af88abb13fb63cc2cc399b4bd3b72d4747b7a7cf + +## Flashing precompiled binaries: + +If you want to flash a pre-compiled binary file (like the Release .bin files) you need specialized software and the same FTDI cable setup already posted [here](Compiling_STM32.md#option-1-flashing-with-tx-powerhighly-recommended). + +1. Set BOOT0 jumper(skip this step if you aready made your own cable ,see above) +1. Connect your 3.3V FTDI cable (USB - TTL serial) to Multiprotocol serial port (RX,TX,GND pins when flashing with TX power). +1. Insert first FTDI serial to USB port.Start TX (only if using flashing with TX power method) +1. The other steps regarding power supply the same as previous recommandation regarding jumpers + +For uploading binaries(.bin files) there is a specialized software you need to install on your computer. + +#### Windows: +Download the **ST Flash Loader Demonstrator** from here: http://www.st.com/content/st_com/en/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-programmers/flasher-stm32.html + +Run the ST Flash Loader program. There are many tutorials on the web on how to use this program.For example: [here](http://www.scienceprog.com/flashing-programs-to-stm32-embedded-bootloader) + +#### OSX: +To be checked. + +### Report issues for the STM32 board +You can report your problem using the [GitHub issue](https://github.com/midelic/DIY-Multiprotocol-TX-Module/issues) system or go to the [Main thread on RCGROUPS](http://www.rcgroups.com/forums/showthread.php?t=2165676) to ask your question. +Please provide the following information: + +- Multiprotocol code version +- STM32 version +- TX type +- Using PPM or Serial, if using er9x or ersky9x the version in use +- Different led status (multimodule and model) +- Explanation of the behavior and reproduction steps diff --git a/docs/Models.md b/docs/Models.md new file mode 100644 index 0000000..b3d1668 --- /dev/null +++ b/docs/Models.md @@ -0,0 +1,226 @@ +# Model Setup +This is the page to document model or receiver specific setup instructions. + +The Deviation project (on which this project was based) have a useful list of models [here](http://www.deviationtx.com/wiki/supported_models). + +# Syma X5C + + +## Channel Map +<<<<<<< HEAD +<<<<<<< HEAD +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9 +---|---|---|---|---|---|---|---|--- +A|E|T|R|FLIP|RATES|PICTURE|VIDEO|HEADLESS +======= +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 +---|---|---|---|---|---|---|--- +A|E|T|R|FLIP|RATES|PICTURE|VIDEO +>>>>>>> dd3f8b4717c03dc2f86701191dc8b265d4706751 +======= +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 +---|---|---|---|---|---|---|--- +A|E|T|R|FLIP|RATES|PICTURE|VIDEO +>>>>>>> af88abb13fb63cc2cc399b4bd3b72d4747b7a7cf + +## Binding +There are no special binding instructions. The model powers up in Autobind mode and expects the bind sequence from the transmitter within the first 4-5 seconds. + +## Tx Setup +A basic 4-channel setup works perfectly, but some improvements are possible: + +### Setting up a switch to Flip + +1. Choose your "Rates" switch - typically the momentary TRN switch +1. In the Mixer create an entry for CH5 +1. Edit this line as follows: + - er9X: Source: sTRN, Weight 100 (or whatever switch you selected) + - OpenTx: Source: SH, Weight 200 (or whatever switch you selected) + +### Setting up a swich for high rates + +1. Choose your "Rates" switch +1. In the Mixer create an entry for CH6 +1. Edit this line as follows: + - er9X: Source: sTHR, Weight 100 (or whatever switch you selected) + - OpenTx: Source: SF, Weight 200 (or whatever switch you selected) + +When the switch is in the rear position the rates will be standard, when the switch is forward rates will be high. There is no need to move the throttle stick to the full up and full down position as with the standard controller. + +### Setting up Idle-up +One of the most annoying functions on the Syma X5C is that the motors stop when the throttle is pulled back. This can be fixed by implmenting Idle-up on the transmitter (think of this as a very simple version of the Betaflight "Air Mode"). Idle up will ensure that even when the throttle is all the way down, a minimum command is passed to the motor to keep them spinning and to activate the stabilization. + +**To do this**: + +1. Decide on a switch you will use to activate Idle up +1. In the mixer menu add a line under Throttle and mix in a value of between 4 and 6 to be added to the throttle value if the switch is activated. What this does is effectively prevents the throttle from going down to less than this value. +1. When you want to fly in "idle-up" mode flick the switch and your stabilization will always be active. +1. Remeber to switch off idle-up as soon as the quad lands (or crashes - to avoid damage to the motors) + +<<<<<<< HEAD +<<<<<<< HEAD +### Additional notes on rates: + +The SymaX driver can add full trim to the control output. Doing so enables +dramatic rates, steep angles, and high speeds. If CH6 is low, the usual Syma +full rates will be in effect. If CH6 is high, the SymaX extreme trim rates will be +in effect. Be cautious when first trying out the extreme rates. + +The extreme rates do not work with with headless mode because in this +mode the trim and the primary control directions may not be aligned - the +primary control directions will be based on the headless mode, but the trims +remain based upon the quadcopter's heading. So extreme rates are disabled +when headless mode is selected. + +Be aware that the use of extreme rates and the resulting steep angles will +disorient the gyro responsible for maintaining headless mode, and that the +direction the quadcopter thinks you selected for headless mode may not be +correct after especially wild flights. + + +======= +>>>>>>> dd3f8b4717c03dc2f86701191dc8b265d4706751 +======= +>>>>>>> af88abb13fb63cc2cc399b4bd3b72d4747b7a7cf +# Inductrix (Horizon Hobby) + + + +## Binding +For telemetry enabled modules, you should just let the remote autodetect the settings. Otherwise choose DSMX 22ms with 6ch or 7ch. To bind the model, keep the transmitter off, power on the Inductrix. Wait until it flashes fast and then power up the Tx and use Bind. + +### Throttle +For Inductrix FPV you might need to adjust the lower end of throttle to be a higher than default, otherwise motors will be spinning on minimal throttle. One way to do this is to set the throttle to 80% output (100% of DSM output) and then to enable the **Throttle Idle Trim Only** under the Model Setup menu. See image below: + + + +### Acro and Level Mode +Setup channel 6 with a momemtary button or switch (e.g. SH on the Taranis) and use that switch to switch between modes. Set the output to somewhere between 40% to 60% for best results. + +An addition consideration when flying in Acro mode is to reduce stick sensitivity and to add some expo. The screens below show one way of doing this. Customize to your needs. + +#### Inputs Screen +The follwing INPUTS screen shows one potential setup to introduce expo for Acro mode. The activation of the expo on Roll, Pitch and Yaw is when the SG switch is not in the back position. Add to taste. + + + +#### Aileron Rates attached to Switch !SG-up +The next screen shows and example of how the expo (50%) was set up on the stick input and how it is activated by !SG-up: + + + +#### Mixer Menu +The next screen shows the mixer menu with the mode change on momentary switch SH and High-Low rates on switch SC: + + + +# Cheerson CX-20 / Quanum Nova + + +## Channel Map + +CH1|CH2|CH3|CH4|CH5|CH6|CH7 +---|---|---|---|---|---|--- +A|E|T|R|MODE|AUX1|AUX2 + +## Binding +The Rx powers up in binding mode so the transmitter should be set to autobind. If the Tx signal is lost due to power-off or going out of range the Rx will not re-bind, and requires power-cycling before it will bind again. + +## Tx Setup +AETR are simple +100% mixes. Note that the model expects Elevator (CH2) to be reversed, which is handled in the module firmware, so no need to reverse it on the Tx. + +### Flight modes +CH5 is used to transmit the flight mode to the APM flight controller by setting the output to a value in a pre-defined range. The original Tx uses a 3-pos switch (SWA) and a 2-pos switch (SWB) to achieve six different combinations, but only five are used - with SWA at 0, 1500 is sent when SWB is at 0 and 1, leaving flight mode 3 unused. However, in the stock CX-20 flight controller settings, both flight mode 3 and 4 are set to the same flight mode, meaning we can configure our new Tx settings to send a value for mode 3 without changing the standard flight mode behaviour. Afterwards, you can optionally use Mission Planner to assign a new flight mode to mode 3 or mode 4, or reconfigure them altogether. + +The values, modes, and switch positions for the stock Tx are: + +Mode|Stock Tx PWM Value|CX-20 Mode|SWA|SWB +---|---|---|---|--- +1|1100|Return to Home|2|0 +2|1300|Altitude Sensor|2|1 +3|||| +4|1500|Manual|0|0 or 1 +5|1700|Direction Lock|1|1 +6|1900|Stable|1|0 + +**NB** The CX-20 uses flight mode names which are different to the standard APM flight mode names. The CX-20 modes map to APM modes as follows: + +CX-20 Mode|APM Mode +---|--- +Manual|Stabilize +Stable|Loiter +Direction Locked|Simple +Altitude Sensor|Altitude Hold +Return to Home|RTL (Return to Launch) + +We need to set the Tx up to output these values on CH5 (or very similar values - more information, including the PWM width ranges is documented in the [Arducopter Wiki](http://ardupilot.org/copter/docs/common-rc-transmitter-flight-mode-configuration.html#common-rc-transmitter-flight-mode-configuration)). + +One easy way to acheive this is to configure six logical switches mapped to two physical switches, for example the 3-way ID switch and the AIL D/R switch, then configure the logical switches to activate a flgiht mode and to apply a specific weight to the CH5 output. + +To simply map the old Tx modes to the new Tx using the same switch positions, use the following configuration. The stock SWA switch is replaced with the ID0/1/2 switch, SWB is replaced with the AIL D/R switch. + +#### Logical switches: + +Switch|Function|V1|V2 +---|---|---|--- +L. Switch 1|AND|ID2|!AIL +L. Switch 2|AND|ID2|AIL +L. Switch 3|AND|ID0|!AIL +L. Switch 4|AND|ID0|AIL +L. Switch 5|AND|ID1|AIL +L. Switch 6|AND|ID1|!AIL + +#### light modes (using CX-20 names): + +Mode|Name|Switch +---|---|--- +1|RTL|L1 +2|AltSen|L2 +3|Manual|L3 +4|Manual|L4 +5|DirLock|L5 +6|Stable|L6 + +#### Mixer setup: + +Channel|Weight|Source|Switch|Multiplex +---|---|---|---|--- +CH5|-80%|HALF|L1|REPLACE + |-40%|HALF|L2|REPLACE + |-20%|HALF|L3|REPLACE + |+0%|HALF|L4|REPLACE + |+40%|HALF|L5|REPLACE + |+80%|HALF|L6|REPLACE + +**NB** The weight values in this table will get you in the ball park, and will most likely work fine. Because transmitters can vary they should be double-checked in the Mission Planer Radio Calibration screen, and tweaked as necessary. + +### CH6 and CH7 +CH6 and CH7 can be assigned to switches or pots to provide additionaly functionality such as PID tuning, gimbal control, or APM auto-tune or auto-land. + +Replicating the stock setup of two pots, you would assign: + +Channel|Weight|Source|Multiplex +---|---|---|--- +CH6|+100%|P1|ADD +CH7|+100%|P3|ADD + +## Full Mixer Setup + +Channel|Source|Weight|Switch|Multiplex +---|---|---|---|--- +CH1|+100%|Aileron|| +CH2|+100%|Elevator|| +CH3|+100%|Throttle|| +CH4|+100%|Rudder|| +CH5|-80%|HALF|L1|REPLACE + |-40%|HALF|L2|REPLACE + |-20%|HALF|L3|REPLACE + |+0%|HALF|L4|REPLACE + |+40%|HALF|L5|REPLACE + |+80%|HALF|L6|REPLACE +CH6|+100%|P1| +CH7|+100%|P3| + +Once you have configured the mixes you should connect Mission Planner to your CX-20 and use the Radio Calibration screen to verify that the channels are correctly assigned, and that the flight modes are correct. Mission planner will give the exact PWM value on CH5, allowing the weights to be adjusted if needed. + + From 067842818e01176a71e324b68554df909993a03b Mon Sep 17 00:00:00 2001 From: pascallanger Date: Mon, 20 Nov 2017 16:04:56 +0100 Subject: [PATCH 096/121] Update README.md --- BootLoaders/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BootLoaders/README.md b/BootLoaders/README.md index 68089dd..0e784d5 100644 --- a/BootLoaders/README.md +++ b/BootLoaders/README.md @@ -6,7 +6,7 @@ The board definition is installed using the Arduino IDE Boards Manager. 1. Open the Arduino IDE 2. Go to File->Preferences (or Ctrl+Comma) -3. Locate the 'Aditional Boards Manager URLs' field and paste in this URL: https://raw.githubusercontent.com/pascallanger/DIY-Multiprotocol-TX-Module/tree/master/BootLoaders/package_multi_4in1_board_index.json +3. Locate the 'Aditional Boards Manager URLs' field and paste in this URL: https://raw.githubusercontent.com/pascallanger/DIY-Multiprotocol-TX-Module/master/BootLoaders/package_multi_4in1_board_index.json 4. Click OK to save the change 5. Click Tools->Board [Board Name]->Boards Manager 6. Scroll to the bottom of the list of boards and click on 'Multi 4-in-1 Boards' then click the Install button From f43d9883cfabf3f6e79faaa0bbe29d30e8277a79 Mon Sep 17 00:00:00 2001 From: pascallanger Date: Mon, 20 Nov 2017 16:07:02 +0100 Subject: [PATCH 097/121] Update package_multi_4in1_board_index.json --- BootLoaders/package_multi_4in1_board_index.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BootLoaders/package_multi_4in1_board_index.json b/BootLoaders/package_multi_4in1_board_index.json index ee63d88..52b7b8c 100644 --- a/BootLoaders/package_multi_4in1_board_index.json +++ b/BootLoaders/package_multi_4in1_board_index.json @@ -17,7 +17,7 @@ "help": { "online": "https://github.com/pascallanger/DIY-Multiprotocol-TX-Module" }, - "url": "https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/tree/master/BootLoaders/package_multi_4in1_board_v1.0.0.zip", + "url": "https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/raw/master/BootLoaders/package_multi_4in1_board_v1.0.0.zip", "archiveFileName": "package_multi_4in1_board_v1.0.0.zip", "checksum": "SHA256:7EA99161FEE2B35D999C69C2C681A326C5A939328DFBCA0A7168AFAC4FB46D06", "size": "2479", From 7d9133793ca6f83e8133e5209550e37fc3f28636 Mon Sep 17 00:00:00 2001 From: pascallanger Date: Mon, 20 Nov 2017 16:08:23 +0100 Subject: [PATCH 098/121] Update package_multi_4in1_board_index.json --- BootLoaders/package_multi_4in1_board_index.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BootLoaders/package_multi_4in1_board_index.json b/BootLoaders/package_multi_4in1_board_index.json index 52b7b8c..e8fba9e 100644 --- a/BootLoaders/package_multi_4in1_board_index.json +++ b/BootLoaders/package_multi_4in1_board_index.json @@ -19,7 +19,7 @@ }, "url": "https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/raw/master/BootLoaders/package_multi_4in1_board_v1.0.0.zip", "archiveFileName": "package_multi_4in1_board_v1.0.0.zip", - "checksum": "SHA256:7EA99161FEE2B35D999C69C2C681A326C5A939328DFBCA0A7168AFAC4FB46D06", + "checksum": "SHA-256:7EA99161FEE2B35D999C69C2C681A326C5A939328DFBCA0A7168AFAC4FB46D06", "size": "2479", "boards": [ {"name": "Multi 4-in-1 (Atmega328p, 3.3V, 16MHz)"} From 9a0873e404c0678d8c1a760f67301cf7c4b6ca5a Mon Sep 17 00:00:00 2001 From: pascallanger Date: Mon, 20 Nov 2017 16:18:41 +0100 Subject: [PATCH 099/121] Update package_multi_4in1_board_index.json --- BootLoaders/package_multi_4in1_board_index.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BootLoaders/package_multi_4in1_board_index.json b/BootLoaders/package_multi_4in1_board_index.json index e8fba9e..de3ee91 100644 --- a/BootLoaders/package_multi_4in1_board_index.json +++ b/BootLoaders/package_multi_4in1_board_index.json @@ -19,8 +19,8 @@ }, "url": "https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/raw/master/BootLoaders/package_multi_4in1_board_v1.0.0.zip", "archiveFileName": "package_multi_4in1_board_v1.0.0.zip", - "checksum": "SHA-256:7EA99161FEE2B35D999C69C2C681A326C5A939328DFBCA0A7168AFAC4FB46D06", - "size": "2479", + "checksum": "SHA-256:714AD7FD60B55C92E2D7E24ED89F8A042C31765E32C9AD2919D82055C9ED719F", + "size": "3103", "boards": [ {"name": "Multi 4-in-1 (Atmega328p, 3.3V, 16MHz)"} ], From ff58a826b174430912512dd0200d878cb76fff57 Mon Sep 17 00:00:00 2001 From: pascallanger Date: Mon, 20 Nov 2017 16:21:38 +0100 Subject: [PATCH 100/121] Delete package_multi_4in1_board_v1.0.0.zip --- BootLoaders/package_multi_4in1_board_v1.0.0.zip | Bin 2479 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 BootLoaders/package_multi_4in1_board_v1.0.0.zip diff --git a/BootLoaders/package_multi_4in1_board_v1.0.0.zip b/BootLoaders/package_multi_4in1_board_v1.0.0.zip deleted file mode 100644 index 1dbc04456cbb2e17419a154f24a82a25ab4d257a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2479 zcma);2{>En8plr%RYFnQRIJ_XMHxy{Gp!(Et6NJNCJj;)iA1QSsg7c5ETu|GtCrSd zZyB`~Es1?;r<{D zfY4wn+L+&0c#21W7B!ffd()M~Qk00ESyNA>l%pCGMlPv}OQ*lc zPaY_lEF@l(Dl3Z@ghythR^EG7q3-BYCe{8-yPEl_vGZs758D4)hIrUUCib&Bs^wY5eCq+x)Stx_dB(2tNDq zw?NIghZt%`UQD=pe)rS17oS3}4vO)H*gIlY%O?DNAH3>_AJIC@t)RZUIt zt)(%xaA;W9kmk3}OH6CMNIYi&K%gF}U4PWaiN zdp}L77fhAoN~iMNr5vzurmKxfD&)~v1Gw!kCK&F zN~a2~v@S=iL+t*l4gio0p`yWp*g9a~nHz~j^(Emw2$X;$JFk@b+e+&|U#hpBH&JIR zM*u*ar=mMWwQ1=*0FVX+0M#9Hex&*lJn=Eq0 zoE|(FV^dGOikrDS73fmgNa8Vm4ClX{JK;I{XwHkgJV`Jfv?E_Es18ZtH)9GJW5w1b zj2C~qYG2;he)>s+_ww0SMl-t5e@D6E*_=3T^4~m|mE%kTtp4z2Bog7IM z91!-2df>7UR$FTjPg^ZHbluR`(u%2m#8c=)kFhQ0yhK<4tnuzo^g8E-Uc|9LCNO-v zxj5HTSg=P%p(lb^SL;_Q)GWj6scWF5fc2V%1;c63_{%SQy(E8Oz};(X{j#Ox=5k`} zE`DzB?H)>eJ*F{-ky%iw&>=_X@Mht1;otv`qt_2RH;JL2TV&5U_lWWn4INvxV*QfB zOqjKz@Bi$0RbA|%S$b&yLS9CIz3Ga%NO0$KFYP3Wq*MqgZ{PGF`ZHuA=& zN@+%0xe7L zR?tEb`bIdZwXg;IKe8tBe|+6;+@+F)kPdx`#K1}-?@aU#1XVn98Tq)@uS{!Si^aQ4 z7q866w<@cRo?|%im8Y^jUO79}-OBbqyZl&oncbDrDl%f0aF!ANkxeL>GaQ#`j%Te6 ze>!25q+qqgOpeQz)|p*WUotq(602Mpxt954vnK?A8nC{-R63r@f^`iChuZ&B-$*}y zY6z#m4>szEfey`ER)0ahMKC`c<)4@~?(uV1ktr_+!7*w8hzITa#p{M<0q~qN#KGb3 zi>IC^QT()gN$z-Gj*ahE+)x$V{%NrVZNz2isky`RaPO)!D9PKgLsbOZ_!m1Jye z4M&+CgC}8?jUuwiiFKmGhS-c2rEC|TP?b@-?!IOQrOVVIzlI(wZHI>Nm;gJyzYc&~ z;T(z^-`sCA!N0CS02x3I#ZM4$>xGCUT`}Q~+uGl9zfEmXP+J~!Ep9L5RzG3ztJrQ( zeKR8Rudj0`|4Us8;8wTzoBFnYa&sUhaT}b?xXIh*e9L7wIh;FmX-CdCJeM2YM7;EH z9>2ZCZ=wI$0NiL7(DJ!&;Pw`|&|B@m&6X!%j21xl=C(KE*KP0A8QknAAbYFcxB7&e zfqdr~vhm0ozed$mhp%(4;`?V8aWmN546vuT)nzG4Q5^L)i?7kiQhZ}>hlYZG!T?|w M_+f#MreS0DU+KoN6951J From 3aed8b84798c735b318b11f007bd98ad6efc4875 Mon Sep 17 00:00:00 2001 From: Pascal Langer Date: Mon, 20 Nov 2017 16:27:23 +0100 Subject: [PATCH 101/121] json --- BootLoaders/package_multi_4in1_board_v1.0.0.zip | Bin 0 -> 3103 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 BootLoaders/package_multi_4in1_board_v1.0.0.zip diff --git a/BootLoaders/package_multi_4in1_board_v1.0.0.zip b/BootLoaders/package_multi_4in1_board_v1.0.0.zip new file mode 100644 index 0000000000000000000000000000000000000000..5668fdbf5ab1f7e895494485f00c338c2b247486 GIT binary patch literal 3103 zcmb_e2{@E%8~z3(*&^#zePr@ArA{?|EKxBrBUBK)-~8 zK;+uZpFh&H?16P~#X8|I?mljy3r5WauY$2BV7(kMzA8$}O3DY!|9qPR@b?3eHq@QC zIS2rhvjc$qH@v+D<*fwzftlCr2z}CmVUsHgFXSzud)il;I?8+dbNQ{YQ@*!<99PI0FUAy( zXE_L4qG1#}Q{6+v~1=Z%^lr=!*}$r+oCbVbAj(g$L{Kq@*_PRxIWhO+ba`Vyqr@jDX9L zL}Gz{Wu0Q2$&K;W#4g1Mr$%ycmqD_;>jaCMbAk!_0Qx`Hckd2UL7kV8lb6PQY)fki zELsm>>^Cw;ordmDJ9{pU;k0_qJ`O_kycip2bXF-p|B3Ue8-6k-EFMLx52@&!6eQe9@o&jwsQfMm4~B<%LRL{ zYPcC0Qxpz3alP-*GDDpe4DjZzz4c>CmCanI_7NWnFmR(jKhueavqMy>BM4tr>0ZcH zFUsnqdRRsZ?L5Wp2O~nGEL>f}S6}b$ zjU5%pO5Y)Z8VSpQmO|@so_zPOL6;5TU6COwKB-pdkhqyr5pq+ql^b)M{g2KV+n&N8!+%F79GYstFmua^WZA^K~pYhr{~0_H4!OB>Dp z;Z?I%n_R56i2rka6n8<$&C$*t-;&3+gCAD9Wr@uz5m?)a{H58bMp^lxGh}PF;zX+B zOB?H|>**e+7axc(Qri+5c?S)mPm=>bP;mv*8Y80hQGF`|Gdh~FQpO9E_{ek-m8k`V zg~Lbt_)C`tucSU?e4QLX1ik@B;k<*i);*4*(pjMb+md z8#uEA5gsu~BaT0{<>|4~C2-Qn03eDsUY@+!mV?QaWIi-(ZyLr(oQQTf3ihvU}9=k$n0hYC6!?laR zNx8-77PpW4Lv79x$z4~iyJI>>4&Ht@nK~7%3uzqZo~#rHXVwVa%Q z^x8imfG9u;9*Em%-w9#lnPC1%`tt_kW+ws$BOOPF7GK-Ijq?FBw*-P6$3f$&$(;8Up<|ON#w@K4fAQWdwiBZM^v+tT7@1kxmo4Ql(r5?Bt!&Vy z($*Ucvo=W_N^_2;jZrp6{;chvdJVHS(l=;Z?-1*qhgpOETc->EZeR}J%f7^{VRkDT eXkCh#UEE71baQqn4VB(qIRHgA0C=&D{`3d^1%grl literal 0 HcmV?d00001 From da2d57c8e9529f47e3432c1415a36b23fe70d8c4 Mon Sep 17 00:00:00 2001 From: Pascal Langer Date: Mon, 20 Nov 2017 16:52:30 +0100 Subject: [PATCH 102/121] AVR Boards --- BootLoaders/Boards/boards.txt | 3 ++- .../package_multi_4in1_board_index.json | 4 ++-- .../package_multi_4in1_board_v1.0.0.zip | Bin 3103 -> 3135 bytes 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/BootLoaders/Boards/boards.txt b/BootLoaders/Boards/boards.txt index fb3daba..4abfa94 100644 --- a/BootLoaders/Boards/boards.txt +++ b/BootLoaders/Boards/boards.txt @@ -17,7 +17,6 @@ multiatmega328p.upload.maximum_data_size=2048 multiatmega328p.build.mcu=atmega328p multiatmega328p.build.f_cpu=16000000L -multiatmega328p.build.board=AVR_PRO multiatmega328p.build.core=arduino:arduino multiatmega328p.build.variant=arduino:eightanaloginputs multiatmega328p.build.extra_flags=-Wl,--relax @@ -29,11 +28,13 @@ multiatmega328p.bootloader.unlock_bits=0x3F multiatmega328p.bootloader.lock_bits=0x0F multiatmega328p.menu.bootloader.none=No bootloader +multiatmega328p.menu.bootloader.none.build.board=MULTI_NO_BOOT multiatmega328p.menu.bootloader.none.upload.maximum_size=32768 multiatmega328p.menu.bootloader.none.bootloader.file=Multi4in1/AtmegaMultiEmpty.hex multiatmega328p.menu.bootloader.none.bootloader.high_fuses=0xD7 multiatmega328p.menu.bootloader.optiboot=Flash from TX +multiatmega328p.menu.bootloader.optiboot.build.board=MULTI_FLASH_FROM_TX multiatmega328p.menu.bootloader.optiboot.upload.maximum_size=32512 multiatmega328p.menu.bootloader.optiboot.bootloader.file=Multi4in1/AtmegaMultiBoot.hex multiatmega328p.menu.bootloader.optiboot.bootloader.high_fuses=0xD6 diff --git a/BootLoaders/package_multi_4in1_board_index.json b/BootLoaders/package_multi_4in1_board_index.json index de3ee91..7b352c3 100644 --- a/BootLoaders/package_multi_4in1_board_index.json +++ b/BootLoaders/package_multi_4in1_board_index.json @@ -19,8 +19,8 @@ }, "url": "https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/raw/master/BootLoaders/package_multi_4in1_board_v1.0.0.zip", "archiveFileName": "package_multi_4in1_board_v1.0.0.zip", - "checksum": "SHA-256:714AD7FD60B55C92E2D7E24ED89F8A042C31765E32C9AD2919D82055C9ED719F", - "size": "3103", + "checksum": "SHA-256:7B8A93E4EDFA8EF63884A6B152C0DAFF24E067FA4F779A52AE77BFC8F23DCB72", + "size": "3135", "boards": [ {"name": "Multi 4-in-1 (Atmega328p, 3.3V, 16MHz)"} ], diff --git a/BootLoaders/package_multi_4in1_board_v1.0.0.zip b/BootLoaders/package_multi_4in1_board_v1.0.0.zip index 5668fdbf5ab1f7e895494485f00c338c2b247486..bb22be91561159ba43af027bc13c5a2ee518d44a 100644 GIT binary patch delta 705 zcmbO)v0q|>hv3E567MqoZ7;=`7#LjG85p!CKV(v!SjSPnHZ(T>mVrpE`y=~^N2!ww zoH*j0J~4~-u3$-xx_NE;2^GJjs~eS%>uuRz#}~g)+R<@se3JF^JH_ummR@4=Z|QMd z6f&(p*Ls=O#cXYXmA$DeG{wI?`EcigcvZ}S_LsILYwTJsOjSIyAtb*bO+s3S^Ng|3 zg$}lez=N}UjX4(!)OSpX*eGDAY&~<0fEH_=!5SsS%X@Abobm5fa`M`-?V6K@T7iek zE^FWYN_DGQ#b#-8RZS>*(U8CH>AyVYbOy1_-`^)BH=oo}H7wh`IH$eMoIluUVZ&9! zzN3X+7u;{2e3>gP6RcsBVfJtN>oqIx2RRv(6x8*^pH)$r`oM=vwW)qm0H=w%zta_Y zKC8K2K3&^QuCA0%YW+KBpYWBpU)-h##b%%4vAeM1&Kf7zx(S(2BpxQ6S)I^0;YrB1 zhmozdM<*q%^DA(A?2_0wvqSUzmQ$-cQdX;cQ*L`KbI^Vb??M%xeEq2r+tSVoTPhoD z{HQ#4vP|i=dF8xODJ~TrhlK3+)^}Z>)A`_Nd~j&P-PZ@tFO+>BH1+=-r*3Y)3yT?^ zhS{FG7r!|>$EiF1^VR16JHEW1b~@Dd*Kxi(=JRjM^0}2hJzeT@^P$)`jq*2tdGD-! zf7xemBeux?LRMV-}mC3AHvUn zm12%H+y1^J-*Z{t!K3DT=IuYeF+*j`nXK5LOvTB!xWbwC cg1Fj~HFOe?)%I?e19s+_t)^4g^}j9D>u?>Vk>i2B<{GP z^H9=%#nT0Q7W0HQu>{pWd(N;kVSQxD+~uA1+AGc;IC1H7l{oMD$v&3#ya}uqrbvEz zYp~a%Y<+v)oDDL)2H_Si@k;hpFBTUx<*kd~x5&3a?E9prCQ|20cpv-o`(OLG@~-D8ZmotrOzJyy%DaKi7MW$h|8&Fti@jNG1ww-;WG++07UXZhrV z3wS4%oL)M)&`Y=1``@7x1qQR`hV3ki2`PExvH1p5YT+VT&eco4{aJ#lWwjk~J^!xKN0EslGuz4Gnm_ziEDCyRwf z%N&XIv!BMe<>^+>u%>COr+7R{{%_wL-7WLD;D)V>y5}qQEt8dgZ+N@PN3X8wKVyJ5 zGm8kr=0!|5Sou&>$K(zUFBVx(w$#bfx#cE*;ZR_zVVZ2nt~A+>i)XS6rytWX7*}la t86a1R87f=OB*g}0Do*~z70xsl#MPc$#~se}6~xq=%*tcJc88q-2mpseF2n!; From 113caf497099490df75d3c1c8e9fe51dd7cc09b7 Mon Sep 17 00:00:00 2001 From: Pascal Langer Date: Mon, 20 Nov 2017 17:04:38 +0100 Subject: [PATCH 103/121] AVR Boards: auto bootloader setting --- Multiprotocol/FrSkyX_cc2500.ino | 10 ---------- Multiprotocol/Validate.h | 10 +++++++++- Multiprotocol/_Config.h | 2 +- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/Multiprotocol/FrSkyX_cc2500.ino b/Multiprotocol/FrSkyX_cc2500.ino index fb514c7..08fc29b 100644 --- a/Multiprotocol/FrSkyX_cc2500.ino +++ b/Multiprotocol/FrSkyX_cc2500.ino @@ -154,17 +154,7 @@ static void __attribute__((unused)) frskyX_data_frame() packet[9+i+2]=chan_1>>4; } -<<<<<<< HEAD packet[21] = (FrX_receive_seq << 4) | FrX_send_seq ;//8 at start -======= - packet[21] = seq_last_sent << 4 | seq_last_rcvd;//8 at start - if (seq_last_sent < 0x08 && seq_last_rcvd < 8) - seq_last_sent = (seq_last_sent + 1) % 4; - else if (seq_last_rcvd == 0x00) - seq_last_sent = 1; - else - seq_last_rcvd = 8; ->>>>>>> dd3f8b4717c03dc2f86701191dc8b265d4706751 if(sub_protocol & 1 )// in X8 mode send only 8ch every 9ms lpass = 0 ; diff --git a/Multiprotocol/Validate.h b/Multiprotocol/Validate.h index f6077ec..f086a16 100644 --- a/Multiprotocol/Validate.h +++ b/Multiprotocol/Validate.h @@ -4,7 +4,7 @@ #endif #if not defined (ORANGE_TX) && not defined (STM32_BOARD) //Atmega328p - #if not defined(ARDUINO_AVR_PRO) && not defined(ARDUINO_AVR_MINI) && not defined(ARDUINO_AVR_NANO) + #if not defined(ARDUINO_AVR_PRO) && not defined(ARDUINO_MULTI_NO_BOOT) && not defined(ARDUINO_MULTI_FLASH_FROM_TX) && not defined(ARDUINO_AVR_MINI) && not defined(ARDUINO_AVR_NANO) #error You must select one of these boards: "Multi 4-in-1", "Arduino Pro or Pro Mini" or "Arduino Mini" #endif #if F_CPU != 16000000L || not defined(__AVR_ATmega328P__) @@ -18,6 +18,14 @@ #endif #endif +//Change/Force configuration for the bootloader option +#if defined ARDUINO_MULTI_FLASH_FROM_TX + #define CHECK_FOR_BOOTLOADER +#endif +#if defined ARDUINO_MULTI_NO_BOOT + #undef CHECK_FOR_BOOTLOADER +#endif + //Change/Force configuration if OrangeTX #ifdef ORANGE_TX #undef ENABLE_PPM // Disable PPM for OrangeTX module diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h index 98645b7..ba1fcc6 100644 --- a/Multiprotocol/_Config.h +++ b/Multiprotocol/_Config.h @@ -54,7 +54,7 @@ /*************************/ //Allow flashing multimodule directly with TX(erky9x or opentx modified firmwares) //Check https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/tree/master/BootLoaders -//To enable this feature remove the "//" on the next line. +//To enable this feature remove the "//" on the next line. It is automatically enabled/disabled when you use the AVR Multi boards. //#define CHECK_FOR_BOOTLOADER /****************/ From aecd4c52660a984355142cf2356b6cd72bf6ed8e Mon Sep 17 00:00:00 2001 From: pascallanger Date: Mon, 20 Nov 2017 17:18:48 +0100 Subject: [PATCH 104/121] Update Compiling_STM32.md --- docs/Compiling_STM32.md | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/docs/Compiling_STM32.md b/docs/Compiling_STM32.md index 103b7ed..82c5c02 100644 --- a/docs/Compiling_STM32.md +++ b/docs/Compiling_STM32.md @@ -86,25 +86,18 @@ Notes: - More explanations how all these work you find [here](http://www.stm32duino.com/viewtopic.php?f=32&t=1774_) - If the initial upload fails, make sure you are running the latest [Java version](https://www.java.com/en/download/) - If using Banggood multiSTM32_USB module, follow instructions from step1(USB drivers on your computer) and jump after, to step 3(most probably generic bootloader is installed on multi module and no need to be installed again).I don't have one for test so this is an educated guess. -<<<<<<< HEAD -<<<<<<< HEAD + #### Option 3: Flashing with TX radio(firmware) -1. Flash new STM32 bootloader(StmBoot) on multimodule.You have 2 options here.You can use one or the other. - -- Flash precompiled binary **StmBoot.ino.generic_stm32f103c** using **ST Flash loader demonstrator** and USB serial device(FTDI) , with same custom cable presented above.This process is the same as flashing with precompiled binaries.For BG(green) module you can folow the paper instructions for flashing coming with the module using bridge pins provided. -- Or you can compile Stmboot files yourself ,**Stmboot.ino** file using arduino IDE ,select Tools ,Upload method : **"Serial"** and press upload button.All this setup is using the same custom cable and USB-serial device(FTDI) as before. -- After this process is complete switch off TX,remove cables FTDI serila device and/or mutimodule jumper used for flashing.The multimodule should be back inthe same state as before. +1. Flash new STM32 bootloader(StmMultiBoot) on multimodule: +- Flash precompiled binary [**StmMuliBoot.bin**](https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/raw/master/BootLoaders/StmMultiBoot/StmMultiBoot.bin) using **ST Flash loader demonstrator** and USB serial device(FTDI) , with same custom cable presented above.This process is the same as flashing with precompiled binaries.For BG(green) module you can folow the paper instructions for flashing coming with the module using bridge pins provided. +- After this process is complete switch off TX,remove cables FTDI serila device and/or mutimodule jumper used for flashing.The multimodule should be back in the same state as before. 1. Compile multiprotocol source in arduino IDE ,choose this time Upload method **STM32duino bootloader** ,select **"Export compiled Binary"** to show the binary file in the same folder as source. -1. Take copy of the resulted binary file, to TX radio SD card ,the firmware folder. -1. Now flash the TX radio with the last firmware(for ersky9x is version P221 "e2" test version or higher). -1. Enter in TX radio maintenance mode(for ersky9X start TX radio with both bottom trims pushed outwards).Select **Update multi** press menu button select also the right com port,update ,then the multiprotocol.bin file (see the correct name) and press menu and again for flashing. You'll see a bar fill slowly .Wait for the procces to be complete.Press exit( or switch off TX) several times to come out of the maintenace mode. -1. Any subsequent update of the multiprotocol will follow 2-3 and 5-6 steps.There is no need anymore USB serial device or cables for flashing. -======= ->>>>>>> dd3f8b4717c03dc2f86701191dc8b265d4706751 -======= ->>>>>>> af88abb13fb63cc2cc399b4bd3b72d4747b7a7cf +1. Copy the resulted binary file to the TX radio SD card in the "/firmware" folder. +1. Now flash the TX radio with the latest firmware(for ersky9x it's version P221 "e2" test version or higher). +1. Enter in TX radio maintenance mode (for ersky9X, start the transmitter with both bottom trims pushed outwards). Select **Update Multi** press menu button select also the right com port,update ,then the multiprotocol.bin file (see the correct name) and press menu and again for flashing. You'll see a bar fill slowly .Wait for the procces to be complete.Press exit( or switch off TX) several times to come out of the maintenace mode. +1. Any subsequent update of the multiprotocol will follow 2-3 and 5-6 steps. There is no need anymore to use a USB serial device or cables for flashing. ## Flashing precompiled binaries: From e0365df6ddce0f3357ca3dae4e9bfdc391129a2c Mon Sep 17 00:00:00 2001 From: Pascal Langer Date: Mon, 20 Nov 2017 18:24:28 +0100 Subject: [PATCH 105/121] StmMultiUSB bootloader --- BootLoaders/StmMultiUSB/README.md | 2 ++ BootLoaders/StmMultiUSB/StmMultiUSB.bin | Bin 0 -> 7184 bytes 2 files changed, 2 insertions(+) create mode 100644 BootLoaders/StmMultiUSB/README.md create mode 100644 BootLoaders/StmMultiUSB/StmMultiUSB.bin diff --git a/BootLoaders/StmMultiUSB/README.md b/BootLoaders/StmMultiUSB/README.md new file mode 100644 index 0000000..52c5a52 --- /dev/null +++ b/BootLoaders/StmMultiUSB/README.md @@ -0,0 +1,2 @@ +[Source for the StmMultiUSB=STM32duino-bootloader](https://github.com/rogerclarkmelbourne/STM32duino-bootloader) +If you want the latest version, you should look for the file generic_boot20_pa1.bin. \ No newline at end of file diff --git a/BootLoaders/StmMultiUSB/StmMultiUSB.bin b/BootLoaders/StmMultiUSB/StmMultiUSB.bin new file mode 100644 index 0000000000000000000000000000000000000000..e8da0d68ea3d3264671e1fe2ca7f16343989ac2d GIT binary patch literal 7184 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 literal 0 HcmV?d00001 From 65a5c37ffb1f56094a96325090c70b19cc2c0667 Mon Sep 17 00:00:00 2001 From: pascallanger Date: Mon, 20 Nov 2017 18:26:46 +0100 Subject: [PATCH 106/121] Update Compiling_STM32.md --- docs/Compiling_STM32.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Compiling_STM32.md b/docs/Compiling_STM32.md index 82c5c02..58809af 100644 --- a/docs/Compiling_STM32.md +++ b/docs/Compiling_STM32.md @@ -77,7 +77,7 @@ See below my module for reference This method use USB connector on the STM32 V1.0 board or on the maple clone board. 1. Install first maple USB driver by running the batch file found in Arduino STM32 package folder ```..\hardware\Arduino_STM32\drivers\win\install_drivers.bat``` -1. Download the free STM32 flash loader demonstrator from [ST.com](http://www.st.com/en/development-tools/flasher-stm32.html) and using a USB-TTL device (like FTDI cable) flash the STM32duino bootloader available from Roger Clark's great STM32 site [here](https://github.com/rogerclarkmelbourne/STM32duino-bootloader/tree/master/STM32F1/binaries) .Use bootloader **generic_boot20_pa1.bin** +1. Download the free STM32 flash loader demonstrator from [ST.com](http://www.st.com/en/development-tools/flasher-stm32.html) and use a USB-TTL device (like FTDI cable) to flash the [StmMultiUSB.bin](https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/raw/master/BootLoaders/StmMultiUSB/StmMultiUSB.bin) bootloader. 1. Open Arduino IDE,browse to multiprotocol folder,load the sketch multiprotocol.ino.Select the serial COM port(see notes below) 1. In Arduino IDE under "Upload method" select **STM32duino**-bootloader.Click upload ,wait until upload is complete. From b15a5d4a45f3cef5607c017085e0e86ee525f749 Mon Sep 17 00:00:00 2001 From: Pascal Langer Date: Mon, 20 Nov 2017 19:12:37 +0100 Subject: [PATCH 107/121] Flysky and Assan output map --- Multiprotocol/ASSAN_nrf24l01.ino | 6 +++++- Multiprotocol/FlySky_a7105.ino | 4 +++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Multiprotocol/ASSAN_nrf24l01.ino b/Multiprotocol/ASSAN_nrf24l01.ino index d5c2090..2435bab 100644 --- a/Multiprotocol/ASSAN_nrf24l01.ino +++ b/Multiprotocol/ASSAN_nrf24l01.ino @@ -53,7 +53,11 @@ void ASSAN_send_packet() uint16_t temp; for(uint8_t i=0;i<8;i++) { - temp=Servo_data[i]<<3; + if(mode_select != MODE_SERIAL) // If in PPM mode extend the output to 1000...2000µs + temp=convert_channel_16b_nolim(i,1000,2000); + else + temp=Servo_data[i]; + temp<<=3; packet[2*i]=temp>>8; packet[2*i+1]=temp; } diff --git a/Multiprotocol/FlySky_a7105.ino b/Multiprotocol/FlySky_a7105.ino index 29c01aa..6a70f03 100644 --- a/Multiprotocol/FlySky_a7105.ino +++ b/Multiprotocol/FlySky_a7105.ino @@ -133,7 +133,7 @@ static void __attribute__((unused)) flysky_build_packet(uint8_t init) { uint8_t i; //servodata timing range for flysky. - ////-100% =~ 0x03e8//=1000us(min) + //-100% =~ 0x03e8//=1000us(min) //+100% =~ 0x07ca//=1994us(max) //Center = 0x5d9//=1497us(center) //channel order AIL;ELE;THR;RUD;AUX1;AUX2;AUX3;AUX4 @@ -147,6 +147,8 @@ static void __attribute__((unused)) flysky_build_packet(uint8_t init) uint16_t temp=Servo_data[CH_AETR[i]]; if(sub_protocol == CX20 && CH_AETR[i] == ELEVATOR) temp=servo_mid-temp; //reverse channel + if(mode_select != MODE_SERIAL) //if in PPM mode extend the output to 1000...2000µs + temp=map(temp,servo_min_100,servo_max_100,1000,2000); packet[5 + i*2]=temp&0xFF; //low byte of servo timing(1000-2000us) packet[6 + i*2]=(temp>>8)&0xFF; //high byte of servo timing(1000-2000us) } From a95fd1e1d8e0122ae6cc7f0312f02eb0a125577e Mon Sep 17 00:00:00 2001 From: Pascal Langer Date: Mon, 20 Nov 2017 21:58:01 +0100 Subject: [PATCH 108/121] SFHSS sub protocols --- Multiprotocol/Multi.txt | 2 +- Multiprotocol/Multiprotocol.h | 12 ++++++++++++ Multiprotocol/SFHSS_cc2500.ino | 13 ++++++++++--- Multiprotocol/_Config.h | 5 ++++- 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/Multiprotocol/Multi.txt b/Multiprotocol/Multi.txt index 9d499cf..bb76f7e 100644 --- a/Multiprotocol/Multi.txt +++ b/Multiprotocol/Multi.txt @@ -18,7 +18,7 @@ 18,MJXq,WLH08,X600,X800,H26D,E010,H26WH 19,Shenqi 20,FY326,FY326,FY319 -21,SFHSS +21,SFHSS,XK,T8J,T10J,TM-FH 22,J6PRO 23,FQ777 24,ASSAN diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index e161833..b12e03e 100644 --- a/Multiprotocol/Multiprotocol.h +++ b/Multiprotocol/Multiprotocol.h @@ -196,6 +196,13 @@ enum Q303 CX10D = 2, CX10WD = 3, }; +enum SFHSS +{ + XK = 0, + T10J = 1, + T8J = 2, + TM_FH = 3, +}; #define NONE 0 #define P_HIGH 1 @@ -585,6 +592,11 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p -- CX35 1 CX10D 2 CX10WD 3 + sub_protocol==SFHSS + XK 0 + T10J 1 + T8J 2 + TM_FH 3 Power value => 0x80 0=High/1=Low Stream[3] = option_protocol; diff --git a/Multiprotocol/SFHSS_cc2500.ino b/Multiprotocol/SFHSS_cc2500.ino index 56aa6cd..960352f 100644 --- a/Multiprotocol/SFHSS_cc2500.ino +++ b/Multiprotocol/SFHSS_cc2500.ino @@ -155,17 +155,24 @@ static void __attribute__((unused)) SFHSS_build_data_packet() // Values grow down and to the right. static void __attribute__((unused)) SFHSS_build_data_packet() { + const uint8_t SFHSS_ident[4][3]={ + { 0x81, 0x00, 0x00}, //XK + { 0x81, 0x42, 0x07}, //T8J + { 0x81, 0x0F, 0x09}, //T10J + { 0x82, 0x9A, 0x06} //TM-FH + }; + uint8_t ch_offset = phase == SFHSS_DATA1 ? 0 : 4; uint16_t ch1 = convert_channel_16b_nolim(CH_AETR[ch_offset+0],2020,1020); uint16_t ch2 = convert_channel_16b_nolim(CH_AETR[ch_offset+1],2020,1020); uint16_t ch3 = convert_channel_16b_nolim(CH_AETR[ch_offset+2],2020,1020); uint16_t ch4 = convert_channel_16b_nolim(CH_AETR[ch_offset+3],2020,1020); - packet[0] = 0x81; // can be 80 or 81 for Orange, only 81 for XK + packet[0] = SFHSS_ident[sub_protocol][0]; // can be 80 or 81 for Orange packet[1] = rx_tx_addr[0]; packet[2] = rx_tx_addr[1]; - packet[3] = 0x0f; //10J - packet[4] = 0x09; //10J + packet[3] = SFHSS_ident[sub_protocol][1]; + packet[4] = SFHSS_ident[sub_protocol][2]; packet[5] = (rf_ch_num << 3) | ((ch1 >> 9) & 0x07); packet[6] = (ch1 >> 1); packet[7] = (ch1 << 7) | ((ch2 >> 5) & 0x7F ); diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h index ba1fcc6..e663438 100644 --- a/Multiprotocol/_Config.h +++ b/Multiprotocol/_Config.h @@ -368,7 +368,10 @@ const PPM_Parameters PPM_prot[15]= { FY326 FY319 MODE_SFHSS - NONE + XK + T10J + T8J + TM_FH MODE_J6PRO NONE MODE_FQ777 From 35089febabfb792d5411d43d2144d5831cf27708 Mon Sep 17 00:00:00 2001 From: Pascal Langer Date: Mon, 20 Nov 2017 22:02:14 +0100 Subject: [PATCH 109/121] SFHSS subprotocols --- Multiprotocol/Multiprotocol.h | 2 +- Protocols_Details.md | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index b12e03e..c55bb34 100644 --- a/Multiprotocol/Multiprotocol.h +++ b/Multiprotocol/Multiprotocol.h @@ -19,7 +19,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 1 #define VERSION_REVISION 6 -#define VERSION_PATCH_LEVEL 23 +#define VERSION_PATCH_LEVEL 24 //****************** // Protocols //****************** diff --git a/Protocols_Details.md b/Protocols_Details.md index cc4b91d..e5eda9c 100644 --- a/Protocols_Details.md +++ b/Protocols_Details.md @@ -209,6 +209,18 @@ CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 ---|---|---|---|---|---|---|--- A|E|T|R|CH5|CH6|CH7|CH8 +### Sub_protocol XK - *0* +XK transmitter + +### Sub_protocol T8J - *1* +Futaba T8J transmitter + +### Sub_protocol T10J - *2* +Futaba T10J transmitter + +### Sub_protocol TM-FH - *3* +Futaba TM-FH transmitter + *** # CYRF6936 RF Module From 4633c373806777c8cef75b975371440012a82e20 Mon Sep 17 00:00:00 2001 From: pascallanger Date: Tue, 21 Nov 2017 17:22:20 +0100 Subject: [PATCH 110/121] Update Models.md --- docs/Models.md | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/docs/Models.md b/docs/Models.md index b3d1668..9e24af6 100644 --- a/docs/Models.md +++ b/docs/Models.md @@ -7,21 +7,10 @@ The Deviation project (on which this project was based) have a useful list of mo ## Channel Map -<<<<<<< HEAD -<<<<<<< HEAD + CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9 ---|---|---|---|---|---|---|---|--- A|E|T|R|FLIP|RATES|PICTURE|VIDEO|HEADLESS -======= -CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 ----|---|---|---|---|---|---|--- -A|E|T|R|FLIP|RATES|PICTURE|VIDEO ->>>>>>> dd3f8b4717c03dc2f86701191dc8b265d4706751 -======= -CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 ----|---|---|---|---|---|---|--- -A|E|T|R|FLIP|RATES|PICTURE|VIDEO ->>>>>>> af88abb13fb63cc2cc399b4bd3b72d4747b7a7cf ## Binding There are no special binding instructions. The model powers up in Autobind mode and expects the bind sequence from the transmitter within the first 4-5 seconds. @@ -57,8 +46,6 @@ One of the most annoying functions on the Syma X5C is that the motors stop when 1. When you want to fly in "idle-up" mode flick the switch and your stabilization will always be active. 1. Remeber to switch off idle-up as soon as the quad lands (or crashes - to avoid damage to the motors) -<<<<<<< HEAD -<<<<<<< HEAD ### Additional notes on rates: The SymaX driver can add full trim to the control output. Doing so enables @@ -78,10 +65,6 @@ direction the quadcopter thinks you selected for headless mode may not be correct after especially wild flights. -======= ->>>>>>> dd3f8b4717c03dc2f86701191dc8b265d4706751 -======= ->>>>>>> af88abb13fb63cc2cc399b4bd3b72d4747b7a7cf # Inductrix (Horizon Hobby) From 41f0a712fd1228039a1a28e7312a84b424599f42 Mon Sep 17 00:00:00 2001 From: Pascal Langer Date: Tue, 21 Nov 2017 21:45:03 +0100 Subject: [PATCH 111/121] S-FHSS improvements --- Multiprotocol/Multi.txt | 2 +- Multiprotocol/Multiprotocol.h | 14 +---- Multiprotocol/NRF24l01_SPI.ino | 6 ++- Multiprotocol/SFHSS_cc2500.ino | 96 +++++++++++++++------------------- Multiprotocol/_Config.h | 11 ++-- 5 files changed, 52 insertions(+), 77 deletions(-) diff --git a/Multiprotocol/Multi.txt b/Multiprotocol/Multi.txt index bb76f7e..9d499cf 100644 --- a/Multiprotocol/Multi.txt +++ b/Multiprotocol/Multi.txt @@ -18,7 +18,7 @@ 18,MJXq,WLH08,X600,X800,H26D,E010,H26WH 19,Shenqi 20,FY326,FY326,FY319 -21,SFHSS,XK,T8J,T10J,TM-FH +21,SFHSS 22,J6PRO 23,FQ777 24,ASSAN diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index c55bb34..30e1a80 100644 --- a/Multiprotocol/Multiprotocol.h +++ b/Multiprotocol/Multiprotocol.h @@ -19,7 +19,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 1 #define VERSION_REVISION 6 -#define VERSION_PATCH_LEVEL 24 +#define VERSION_PATCH_LEVEL 25 //****************** // Protocols //****************** @@ -196,13 +196,6 @@ enum Q303 CX10D = 2, CX10WD = 3, }; -enum SFHSS -{ - XK = 0, - T10J = 1, - T8J = 2, - TM_FH = 3, -}; #define NONE 0 #define P_HIGH 1 @@ -592,11 +585,6 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p -- CX35 1 CX10D 2 CX10WD 3 - sub_protocol==SFHSS - XK 0 - T10J 1 - T8J 2 - TM_FH 3 Power value => 0x80 0=High/1=Low Stream[3] = option_protocol; diff --git a/Multiprotocol/NRF24l01_SPI.ino b/Multiprotocol/NRF24l01_SPI.ino index 32a12fc..bbe2ed0 100644 --- a/Multiprotocol/NRF24l01_SPI.ino +++ b/Multiprotocol/NRF24l01_SPI.ino @@ -27,6 +27,7 @@ uint8_t rf_setup; void NRF24L01_Initialize() { rf_setup = 0x09; + prev_power = 0x00; // Make sure prev_power is inline with current power XN297_SetScrambledMode(XN297_SCRAMBLED); } @@ -133,7 +134,8 @@ void NRF24L01_SetBitrate(uint8_t bitrate) // Bit 0 goes to RF_DR_HIGH, bit 1 - to RF_DR_LOW rf_setup = (rf_setup & 0xD7) | ((bitrate & 0x02) << 4) | ((bitrate & 0x01) << 3); - NRF24L01_WriteReg(NRF24L01_06_RF_SETUP, rf_setup); + prev_power=(rf_setup>>1)&0x03; // Make sure prev_power is inline with current power + NRF24L01_WriteReg(NRF24L01_06_RF_SETUP, rf_setup); } /* @@ -167,9 +169,9 @@ void NRF24L01_SetPower() #endif if(IS_RANGE_FLAG_on) power=NRF_POWER_0; - rf_setup = (rf_setup & 0xF9) | (power << 1); if(prev_power != power) { + rf_setup = (rf_setup & 0xF9) | (power << 1); NRF24L01_WriteReg(NRF24L01_06_RF_SETUP, rf_setup); prev_power=power; } diff --git a/Multiprotocol/SFHSS_cc2500.ino b/Multiprotocol/SFHSS_cc2500.ino index 960352f..edc6190 100644 --- a/Multiprotocol/SFHSS_cc2500.ino +++ b/Multiprotocol/SFHSS_cc2500.ino @@ -23,14 +23,14 @@ #define SFHSS_PACKET_LEN 13 #define SFHSS_TX_ID_LEN 2 -uint8_t fhss_code; // 0-27 +uint8_t fhss_code=0; // 0-27 enum { SFHSS_START = 0x00, SFHSS_CAL = 0x01, - SFHSS_DATA1 = 0x02, // do not change this value - SFHSS_DATA2 = 0x0B, // do not change this value - SFHSS_TUNE = 0x0F + SFHSS_DATA1 = 0x02, + SFHSS_DATA2 = 0x03, + SFHSS_TUNE = 0x04 }; #define SFHSS_FREQ0_VAL 0xC4 @@ -122,65 +122,48 @@ static void __attribute__((unused)) SFHSS_calc_next_chan() } } -/*// Channel values are 10-bit values between 86 and 906, 496 is the middle. -// Values grow down and to the right. -static void __attribute__((unused)) SFHSS_build_data_packet() -{ -#define spacer1 0x02 -#define spacer2 (spacer1 << 4) - uint8_t ch_offset = phase == SFHSS_DATA1 ? 0 : 4; - uint16_t ch1 = convert_channel_16b_nolim(CH_AETR[ch_offset+0],86,906); - uint16_t ch2 = convert_channel_16b_nolim(CH_AETR[ch_offset+1],86,906); - uint16_t ch3 = convert_channel_16b_nolim(CH_AETR[ch_offset+2],86,906); - uint16_t ch4 = convert_channel_16b_nolim(CH_AETR[ch_offset+3],86,906); - - packet[0] = 0x81; // can be 80 or 81 for Orange, only 81 for XK - packet[1] = rx_tx_addr[0]; - packet[2] = rx_tx_addr[1]; - packet[3] = 0; - packet[4] = 0; - packet[5] = (rf_ch_num << 3) | spacer1 | ((ch1 >> 9) & 0x01); - packet[6] = (ch1 >> 1); - packet[7] = (ch1 << 7) | spacer2 | ((ch2 >> 5) & 0x1F); - packet[8] = (ch2 << 3) | spacer1 | ((ch3 >> 9) & 0x01); - packet[9] = (ch3 >> 1); - packet[10] = (ch3 << 7) | spacer2 | ((ch4 >> 5) & 0x1F); - packet[11] = (ch4 << 3) | ((fhss_code >> 2) & 0x07); - packet[12] = (fhss_code << 6) | phase; -} -*/ - // Channel values are 12-bit values between 1020 and 2020, 1520 is the middle. // Futaba @140% is 2070...1520...970 // Values grow down and to the right. static void __attribute__((unused)) SFHSS_build_data_packet() { - const uint8_t SFHSS_ident[4][3]={ - { 0x81, 0x00, 0x00}, //XK - { 0x81, 0x42, 0x07}, //T8J - { 0x81, 0x0F, 0x09}, //T10J - { 0x82, 0x9A, 0x06} //TM-FH - }; - - uint8_t ch_offset = phase == SFHSS_DATA1 ? 0 : 4; + // command.bit0 is the packet number indicator: =0 -> SFHSS_DATA1, =1 -> SFHSS_DATA2 + // command.bit1 is unknown but seems to be linked to the payload[0].bit0 but more dumps are needed: payload[0]=0x82 -> =0, payload[0]=0x81 -> =1 + // command.bit2 is the failsafe transmission indicator: =0 -> normal data, =1->failsafe data + // command.bit3 is the channels indicator: =0 -> CH1-4, =1 -> CH5-8 + uint8_t command= (phase == SFHSS_DATA1) ? 0 : 1; // Building packet for Data1 or Data2 + counter+=command; + if(counter&1) command|=0x08; // Transmit lower and upper channels twice in a row + if((counter&0x3FE)==0x3FE) + { + command|=0x04; // Transmit failsafe data every 7s + counter&=0x3FF; // Reset counter + } + else + command|=0x02; // Assuming packet[0] == 0x81 + uint8_t ch_offset = ((command&0x08) >> 1) + ((command&0x04)<<1); // CH1..CH8 when failsafe is off, CH9..CH16 when failsafe is on uint16_t ch1 = convert_channel_16b_nolim(CH_AETR[ch_offset+0],2020,1020); uint16_t ch2 = convert_channel_16b_nolim(CH_AETR[ch_offset+1],2020,1020); uint16_t ch3 = convert_channel_16b_nolim(CH_AETR[ch_offset+2],2020,1020); uint16_t ch4 = convert_channel_16b_nolim(CH_AETR[ch_offset+3],2020,1020); - packet[0] = SFHSS_ident[sub_protocol][0]; // can be 80 or 81 for Orange + // XK [0]=0x81 [3]=0x00 [4]=0x00 + // T8J [0]=0x81 [3]=0x42 [4]=0x07 + // T10J [0]=0x81 [3]=0x0F [4]=0x09 + // TM-FH [0]=0x82 [3]=0x9A [4]=0x06 + packet[0] = 0x81; // can be 80 or 81 for Orange, only 81 for XK packet[1] = rx_tx_addr[0]; packet[2] = rx_tx_addr[1]; - packet[3] = SFHSS_ident[sub_protocol][1]; - packet[4] = SFHSS_ident[sub_protocol][2]; + packet[3] = rx_tx_addr[2]; // ID? + packet[4] = rx_tx_addr[3]; // ID? packet[5] = (rf_ch_num << 3) | ((ch1 >> 9) & 0x07); packet[6] = (ch1 >> 1); packet[7] = (ch1 << 7) | ((ch2 >> 5) & 0x7F ); - packet[8] = (ch2 << 3) | ((ch3 >> 9) & 0x07); + packet[8] = (ch2 << 3) | ((ch3 >> 9) & 0x07 ); packet[9] = (ch3 >> 1); packet[10] = (ch3 << 7) | ((ch4 >> 5) & 0x7F ); packet[11] = (ch4 << 3) | ((fhss_code >> 2) & 0x07 ); - packet[12] = (fhss_code << 6) | phase; + packet[12] = (fhss_code << 6) | command; } static void __attribute__((unused)) SFHSS_send_packet() @@ -204,28 +187,31 @@ uint16_t ReadSFHSS() else { rf_ch_num = 0; + counter = 0; phase = SFHSS_DATA1; } return 2000; - /* Work cycle, 6.8ms, second packet 1.65ms after first */ + /* Work cycle: 6.8ms */ +#define SFHSS_PACKET_PERIOD 6800 +#define SFHSS_DATA2_TIMING 1630 // original 1650 case SFHSS_DATA1: SFHSS_build_data_packet(); SFHSS_send_packet(); phase = SFHSS_DATA2; - return 1650; + return SFHSS_DATA2_TIMING; // original 1650 case SFHSS_DATA2: SFHSS_build_data_packet(); SFHSS_send_packet(); SFHSS_calc_next_chan(); phase = SFHSS_TUNE; - return 2000; + return (SFHSS_PACKET_PERIOD -2000 -SFHSS_DATA2_TIMING); // original 2000 case SFHSS_TUNE: phase = SFHSS_DATA1; SFHSS_tune_freq(); SFHSS_tune_chan_fast(); CC2500_SetPower(); - return 3150; + return 2000; // original 3150 } return 0; } @@ -233,13 +219,13 @@ uint16_t ReadSFHSS() // Generate internal id static void __attribute__((unused)) SFHSS_get_tx_id() { - uint32_t fixed_id; // Some receivers (Orange) behaves better if they tuned to id that has // no more than 6 consecutive zeros and ones + uint32_t fixed_id; uint8_t run_count = 0; // add guard for bit count fixed_id = 1 ^ (MProtocol_id & 1); - for (uint8_t i = 0; i < 16; ++i) + for (uint8_t i = 0; i < 32; ++i) { fixed_id = (fixed_id << 1) | (MProtocol_id & 1); MProtocol_id >>= 1; @@ -256,8 +242,10 @@ static void __attribute__((unused)) SFHSS_get_tx_id() run_count = 0; } // fixed_id = 0xBC11; - rx_tx_addr[0] = fixed_id >> 8; - rx_tx_addr[1] = fixed_id; + rx_tx_addr[0] = fixed_id >> 24; + rx_tx_addr[1] = fixed_id >> 16; + rx_tx_addr[2] = fixed_id >> 8; + rx_tx_addr[3] = fixed_id >> 0; } uint16_t initSFHSS() @@ -265,7 +253,7 @@ uint16_t initSFHSS() BIND_DONE; // Not a TX bind protocol SFHSS_get_tx_id(); - fhss_code=rx_tx_addr[2]%28; // Initialize it to random 0-27 inclusive + fhss_code=random(0xfefefefe)%28; // Initialize it to random 0-27 inclusive SFHSS_rf_init(); phase = SFHSS_START; diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h index e663438..c6e6506 100644 --- a/Multiprotocol/_Config.h +++ b/Multiprotocol/_Config.h @@ -136,9 +136,9 @@ #define FQ777_NRF24L01_INO #define ASSAN_NRF24L01_INO #define HONTAI_NRF24L01_INO -#define Q303_NRF24L01_INO -#define GW008_NRF24L01_INO -#define DM002_NRF24L01_INO +#define Q303_NRF24L01_INO +#define GW008_NRF24L01_INO +#define DM002_NRF24L01_INO /**************************/ /*** FAILSAFE SETTINGS ***/ @@ -368,10 +368,7 @@ const PPM_Parameters PPM_prot[15]= { FY326 FY319 MODE_SFHSS - XK - T10J - T8J - TM_FH + NONE MODE_J6PRO NONE MODE_FQ777 From 0e4583f8e2d2acb13fe3955d31d3c75bd1506407 Mon Sep 17 00:00:00 2001 From: pascallanger Date: Tue, 21 Nov 2017 21:47:08 +0100 Subject: [PATCH 112/121] Update Protocols_Details.md --- Protocols_Details.md | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/Protocols_Details.md b/Protocols_Details.md index e5eda9c..cc4b91d 100644 --- a/Protocols_Details.md +++ b/Protocols_Details.md @@ -209,18 +209,6 @@ CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 ---|---|---|---|---|---|---|--- A|E|T|R|CH5|CH6|CH7|CH8 -### Sub_protocol XK - *0* -XK transmitter - -### Sub_protocol T8J - *1* -Futaba T8J transmitter - -### Sub_protocol T10J - *2* -Futaba T10J transmitter - -### Sub_protocol TM-FH - *3* -Futaba TM-FH transmitter - *** # CYRF6936 RF Module From 2ffa2d7b7375832276be659eedc1c9321d7db829 Mon Sep 17 00:00:00 2001 From: pascallanger Date: Tue, 21 Nov 2017 22:03:28 +0100 Subject: [PATCH 113/121] Update Protocols_Details.md --- Protocols_Details.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Protocols_Details.md b/Protocols_Details.md index cc4b91d..e3dd1c0 100644 --- a/Protocols_Details.md +++ b/Protocols_Details.md @@ -209,6 +209,8 @@ CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 ---|---|---|---|---|---|---|--- A|E|T|R|CH5|CH6|CH7|CH8 +Channels 9 to 16 are used as failsafe values for the channels 1 to 8. + *** # CYRF6936 RF Module From 76e90029953813846c2e94aab3a72e285f6700c8 Mon Sep 17 00:00:00 2001 From: Pascal Langer Date: Wed, 22 Nov 2017 13:56:42 +0100 Subject: [PATCH 114/121] S-FHSS failsafe --- BootLoaders/Boards/boards.txt | 3 ++ .../package_multi_4in1_board_index.json | 4 +- .../package_multi_4in1_board_v1.0.0.zip | Bin 3135 -> 3161 bytes Multiprotocol/Multiprotocol.h | 2 +- Multiprotocol/Multiprotocol.ino | 2 +- Multiprotocol/SFHSS_cc2500.ino | 37 +++++++++++++----- Multiprotocol/_MyConfig.h | 23 +++++++++++ 7 files changed, 57 insertions(+), 14 deletions(-) create mode 100644 Multiprotocol/_MyConfig.h diff --git a/BootLoaders/Boards/boards.txt b/BootLoaders/Boards/boards.txt index 4abfa94..6735147 100644 --- a/BootLoaders/Boards/boards.txt +++ b/BootLoaders/Boards/boards.txt @@ -20,6 +20,7 @@ multiatmega328p.build.f_cpu=16000000L multiatmega328p.build.core=arduino:arduino multiatmega328p.build.variant=arduino:eightanaloginputs multiatmega328p.build.extra_flags=-Wl,--relax +multiatmega328p.build.board=MULTI_AVR multiatmega328p.bootloader.tool=arduino:avrdude multiatmega328p.bootloader.low_fuses=0xFF @@ -29,12 +30,14 @@ multiatmega328p.bootloader.lock_bits=0x0F multiatmega328p.menu.bootloader.none=No bootloader multiatmega328p.menu.bootloader.none.build.board=MULTI_NO_BOOT + multiatmega328p.menu.bootloader.none.upload.maximum_size=32768 multiatmega328p.menu.bootloader.none.bootloader.file=Multi4in1/AtmegaMultiEmpty.hex multiatmega328p.menu.bootloader.none.bootloader.high_fuses=0xD7 multiatmega328p.menu.bootloader.optiboot=Flash from TX multiatmega328p.menu.bootloader.optiboot.build.board=MULTI_FLASH_FROM_TX + multiatmega328p.menu.bootloader.optiboot.upload.maximum_size=32512 multiatmega328p.menu.bootloader.optiboot.bootloader.file=Multi4in1/AtmegaMultiBoot.hex multiatmega328p.menu.bootloader.optiboot.bootloader.high_fuses=0xD6 diff --git a/BootLoaders/package_multi_4in1_board_index.json b/BootLoaders/package_multi_4in1_board_index.json index 7b352c3..1d5b725 100644 --- a/BootLoaders/package_multi_4in1_board_index.json +++ b/BootLoaders/package_multi_4in1_board_index.json @@ -19,8 +19,8 @@ }, "url": "https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/raw/master/BootLoaders/package_multi_4in1_board_v1.0.0.zip", "archiveFileName": "package_multi_4in1_board_v1.0.0.zip", - "checksum": "SHA-256:7B8A93E4EDFA8EF63884A6B152C0DAFF24E067FA4F779A52AE77BFC8F23DCB72", - "size": "3135", + "checksum": "SHA-256:F5CF6502AB15B2BEC5F47CE0258DB9A1682CA3A4F2A4E490EA76F54961072483", + "size": "3161", "boards": [ {"name": "Multi 4-in-1 (Atmega328p, 3.3V, 16MHz)"} ], diff --git a/BootLoaders/package_multi_4in1_board_v1.0.0.zip b/BootLoaders/package_multi_4in1_board_v1.0.0.zip index bb22be91561159ba43af027bc13c5a2ee518d44a..af0bf240dd8c8d5b9edb1f5356170ba846c4aed6 100644 GIT binary patch literal 3161 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 //#define DEBUG_TX -//#define USE_MY_CONFIG +#define USE_MY_CONFIG #ifdef ARDUINO_AVR_XMEGA32D4 #include "MultiOrange.h" #endif diff --git a/Multiprotocol/SFHSS_cc2500.ino b/Multiprotocol/SFHSS_cc2500.ino index edc6190..6f995f8 100644 --- a/Multiprotocol/SFHSS_cc2500.ino +++ b/Multiprotocol/SFHSS_cc2500.ino @@ -127,25 +127,42 @@ static void __attribute__((unused)) SFHSS_calc_next_chan() // Values grow down and to the right. static void __attribute__((unused)) SFHSS_build_data_packet() { + uint16_t ch1,ch2,ch3,ch4; // command.bit0 is the packet number indicator: =0 -> SFHSS_DATA1, =1 -> SFHSS_DATA2 // command.bit1 is unknown but seems to be linked to the payload[0].bit0 but more dumps are needed: payload[0]=0x82 -> =0, payload[0]=0x81 -> =1 // command.bit2 is the failsafe transmission indicator: =0 -> normal data, =1->failsafe data // command.bit3 is the channels indicator: =0 -> CH1-4, =1 -> CH5-8 + + //Coding below matches the Futaba T8J transmission scheme DATA1->CH1-4, DATA2->CH5-8, DATA1->CH5-8, DATA2->CH1-4,... + // XK, T10J and TM-FH are different with a classic DATA1->CH1-4, DATA2->CH5-8,... + //Failsafe is sent twice every couple of seconds (unknown but >5s) + uint8_t command= (phase == SFHSS_DATA1) ? 0 : 1; // Building packet for Data1 or Data2 counter+=command; - if(counter&1) command|=0x08; // Transmit lower and upper channels twice in a row - if((counter&0x3FE)==0x3FE) - { - command|=0x04; // Transmit failsafe data every 7s - counter&=0x3FF; // Reset counter + if( (counter&0x3FC) == 0x3FC ) + { // Transmit failsafe data twice every 7s + if( ((counter&1)^(command&1)) == 0 ) + command|=0x04; // Failsafe } else command|=0x02; // Assuming packet[0] == 0x81 - uint8_t ch_offset = ((command&0x08) >> 1) + ((command&0x04)<<1); // CH1..CH8 when failsafe is off, CH9..CH16 when failsafe is on - uint16_t ch1 = convert_channel_16b_nolim(CH_AETR[ch_offset+0],2020,1020); - uint16_t ch2 = convert_channel_16b_nolim(CH_AETR[ch_offset+1],2020,1020); - uint16_t ch3 = convert_channel_16b_nolim(CH_AETR[ch_offset+2],2020,1020); - uint16_t ch4 = convert_channel_16b_nolim(CH_AETR[ch_offset+3],2020,1020); + counter&=0x3FF; // Reset failsafe counter + if(counter&1) command|=0x08; // Transmit lower and upper channels twice in a row + if(command&0x04) + {//Failsafe data + ch1=0x400; // Centered + ch2=0x400; // Centered + ch3=(command&0x08)?0x400:0xC00; // Centered or zero if throttle channel + ch4=0x400; // Centered + } + else + {//Normal data + uint8_t ch_offset = (command&0x08) >> 1; // CH1..CH4 or CH5..CH8 + ch1 = convert_channel_16b_nolim(CH_AETR[ch_offset+0],2020,1020); + ch2 = convert_channel_16b_nolim(CH_AETR[ch_offset+1],2020,1020); + ch3 = convert_channel_16b_nolim(CH_AETR[ch_offset+2],2020,1020); + ch4 = convert_channel_16b_nolim(CH_AETR[ch_offset+3],2020,1020); + } // XK [0]=0x81 [3]=0x00 [4]=0x00 // T8J [0]=0x81 [3]=0x42 [4]=0x07 diff --git a/Multiprotocol/_MyConfig.h b/Multiprotocol/_MyConfig.h new file mode 100644 index 0000000..1ab7c1f --- /dev/null +++ b/Multiprotocol/_MyConfig.h @@ -0,0 +1,23 @@ +//#define FORCE_GLOBAL_ID 0x12345678 + +#if not defined STM32_BOARD + // #undef AFHDS2A_A7105_INO + + // #undef DEVO_CYRF6936_INO + // #undef J6PRO_CYRF6936_INO + // #undef WK2x01_CYRF6936_INO + + // #undef FRSKYV_CC2500_INO + // #undef FRSKYX_CC2500_INO + + // #undef KN_NRF24L01_INO + // #undef SLT_NRF24L01_INO + + // #undef FY326_NRF24L01_INO + // #undef FQ777_NRF24L01_INO + // #undef ASSAN_NRF24L01_INO + // #undef HONTAI_NRF24L01_INO + // #undef Q303_NRF24L01_INO + // #undef GW008_NRF24L01_INO + // #undef DM002_NRF24L01_INO +#endif From bd9c772a52236e9e3661945346db662ad2fde3d7 Mon Sep 17 00:00:00 2001 From: Pascal Langer Date: Wed, 22 Nov 2017 14:51:45 +0100 Subject: [PATCH 115/121] S-FHSS: fix failsafe --- Multiprotocol/Multiprotocol.h | 2 +- Multiprotocol/SFHSS_cc2500.ino | 26 +++++++++++++------------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index 7969787..02e175e 100644 --- a/Multiprotocol/Multiprotocol.h +++ b/Multiprotocol/Multiprotocol.h @@ -19,7 +19,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 1 #define VERSION_REVISION 6 -#define VERSION_PATCH_LEVEL 26 +#define VERSION_PATCH_LEVEL 27 //****************** // Protocols //****************** diff --git a/Multiprotocol/SFHSS_cc2500.ino b/Multiprotocol/SFHSS_cc2500.ino index 6f995f8..dde3178 100644 --- a/Multiprotocol/SFHSS_cc2500.ino +++ b/Multiprotocol/SFHSS_cc2500.ino @@ -148,20 +148,20 @@ static void __attribute__((unused)) SFHSS_build_data_packet() command|=0x02; // Assuming packet[0] == 0x81 counter&=0x3FF; // Reset failsafe counter if(counter&1) command|=0x08; // Transmit lower and upper channels twice in a row + + uint8_t ch_offset = ((command&0x08) >> 1) | ((command&0x04) << 1); // CH1..CH4 or CH5..CH8, if failsafe CH9..CH12 or CH13..CH16 + ch1 = convert_channel_16b_nolim(CH_AETR[ch_offset+0],2020,1020); + ch2 = convert_channel_16b_nolim(CH_AETR[ch_offset+1],2020,1020); + ch3 = convert_channel_16b_nolim(CH_AETR[ch_offset+2],2020,1020); + ch4 = convert_channel_16b_nolim(CH_AETR[ch_offset+3],2020,1020); + if(command&0x04) - {//Failsafe data - ch1=0x400; // Centered - ch2=0x400; // Centered - ch3=(command&0x08)?0x400:0xC00; // Centered or zero if throttle channel - ch4=0x400; // Centered - } - else - {//Normal data - uint8_t ch_offset = (command&0x08) >> 1; // CH1..CH4 or CH5..CH8 - ch1 = convert_channel_16b_nolim(CH_AETR[ch_offset+0],2020,1020); - ch2 = convert_channel_16b_nolim(CH_AETR[ch_offset+1],2020,1020); - ch3 = convert_channel_16b_nolim(CH_AETR[ch_offset+2],2020,1020); - ch4 = convert_channel_16b_nolim(CH_AETR[ch_offset+3],2020,1020); + {//Failsafe data are coded for sbus: (ch_value-880)/0.625 + ch1=((ch1-880)<<3)/5; + ch2=((ch2-880)<<3)/5; + ch3=((ch3-880)<<3)/5; + if((command&0x08)==0) ch3|=0x800; // Special flag for throttle which appears on dumps... + ch4=((ch4-880)<<3)/5; } // XK [0]=0x81 [3]=0x00 [4]=0x00 From 205d728798d44b1b5df7cd59de308336b65619d7 Mon Sep 17 00:00:00 2001 From: Pascal Langer Date: Wed, 22 Nov 2017 15:21:36 +0100 Subject: [PATCH 116/121] S-FHSS Failsafe: SFHSS_FAILSAFE_THROTTLE --- Multiprotocol/SFHSS_cc2500.ino | 15 ++++++++++----- Multiprotocol/_Config.h | 4 ++++ 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/Multiprotocol/SFHSS_cc2500.ino b/Multiprotocol/SFHSS_cc2500.ino index dde3178..7491cac 100644 --- a/Multiprotocol/SFHSS_cc2500.ino +++ b/Multiprotocol/SFHSS_cc2500.ino @@ -157,11 +157,16 @@ static void __attribute__((unused)) SFHSS_build_data_packet() if(command&0x04) {//Failsafe data are coded for sbus: (ch_value-880)/0.625 - ch1=((ch1-880)<<3)/5; - ch2=((ch2-880)<<3)/5; - ch3=((ch3-880)<<3)/5; - if((command&0x08)==0) ch3|=0x800; // Special flag for throttle which appears on dumps... - ch4=((ch4-880)<<3)/5; + #ifndef SFHSS_FAILSAFE_THROTTLE + ch1=((ch1-880)<<3)/5; + ch2=((ch2-880)<<3)/5; + ch3=((ch3-880)<<3)/5; + if((command&0x08)==0) ch3|=0x800; // Special flag for throttle which appears on dumps... + ch4=((ch4-880)<<3)/5; + #else + ch1=1024;ch2=1024;ch4=1024; // All channels centered + ch3=((command&0x08)==0)?0xF70:1024; // except throttle value set to 970 with 0x800 flag set + #endif } // XK [0]=0x81 [3]=0x00 [4]=0x00 diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h index c6e6506..11d1905 100644 --- a/Multiprotocol/_Config.h +++ b/Multiprotocol/_Config.h @@ -143,6 +143,10 @@ /**************************/ /*** FAILSAFE SETTINGS ***/ /**************************/ +//SHFSS failsafe is by default using the values of channels 9 to 16 +//You can uncomment the setting below to not use channels 9 to 16 but just bring down throttle +//#define SFHSS_FAILSAFE_THROTTLE + #define AFHDS2A_FAILSAFE #ifdef AFHDS2A_FAILSAFE /* From d9282ac750de80aa6b379434eb114ff4800c4243 Mon Sep 17 00:00:00 2001 From: Pascal Langer Date: Wed, 22 Nov 2017 18:04:40 +0100 Subject: [PATCH 117/121] Boards correction --- BootLoaders/Boards/boards.txt | 2 +- .../package_multi_4in1_board_index.json | 2 +- .../package_multi_4in1_board_v1.0.0.zip | Bin 3161 -> 3161 bytes 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/BootLoaders/Boards/boards.txt b/BootLoaders/Boards/boards.txt index 6735147..928fdbd 100644 --- a/BootLoaders/Boards/boards.txt +++ b/BootLoaders/Boards/boards.txt @@ -38,7 +38,7 @@ multiatmega328p.menu.bootloader.none.bootloader.high_fuses=0xD7 multiatmega328p.menu.bootloader.optiboot=Flash from TX multiatmega328p.menu.bootloader.optiboot.build.board=MULTI_FLASH_FROM_TX -multiatmega328p.menu.bootloader.optiboot.upload.maximum_size=32512 +multiatmega328p.menu.bootloader.optiboot.upload.maximum_size=32256 multiatmega328p.menu.bootloader.optiboot.bootloader.file=Multi4in1/AtmegaMultiBoot.hex multiatmega328p.menu.bootloader.optiboot.bootloader.high_fuses=0xD6 diff --git a/BootLoaders/package_multi_4in1_board_index.json b/BootLoaders/package_multi_4in1_board_index.json index 1d5b725..911e9d5 100644 --- a/BootLoaders/package_multi_4in1_board_index.json +++ b/BootLoaders/package_multi_4in1_board_index.json @@ -19,7 +19,7 @@ }, "url": "https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/raw/master/BootLoaders/package_multi_4in1_board_v1.0.0.zip", "archiveFileName": "package_multi_4in1_board_v1.0.0.zip", - "checksum": "SHA-256:F5CF6502AB15B2BEC5F47CE0258DB9A1682CA3A4F2A4E490EA76F54961072483", + "checksum": "SHA-256:61AB463B5B91BCCBF285EB4C801B37E4F46138CA8762E4C04CCB09C2FF157CB7", "size": "3161", "boards": [ {"name": "Multi 4-in-1 (Atmega328p, 3.3V, 16MHz)"} diff --git a/BootLoaders/package_multi_4in1_board_v1.0.0.zip b/BootLoaders/package_multi_4in1_board_v1.0.0.zip index af0bf240dd8c8d5b9edb1f5356170ba846c4aed6..b0f14fdf32ab9f65ed68640e6d589786438fa892 100644 GIT binary patch delta 615 zcmV-t0+{{T7}*$*NC-)gc1zb_NR5$DMt}GSUqbSMibhm|vTE6GZ;?ry#H!q~6s&3iM?m(hwS|QhwSz8{&EvkIOCA22{=Z3%V!vfz; zZ*j-!V~lO(=pzDR|&BD+CAy+sP!kP$BS3P=6hO ziqm>6i~Q2a8Db`lwFb}vsLvF+IZnTWztKPoBQ!@n%q8xiAGT#bHBo1P7PI%CXwyQI zRm?(acSp$%jjtYA3AqB*2Odk(n32!2ljGYaI;4Ob0c@d%v*V2*Z^kqKcA|8<8FvSZT$|8<8FvSYFeSptg3 BCsF_a delta 610 zcmV-o0-gQY7}*$*NC-x5c1slXny!&hMt?#GUqbSMibhm|vTE6GZ;?ry#HwRkj$LSf z{U#I$-6bff^(D6R=DnHcanb^hgp5I=wamu09aEi{wH1ie#ws+F3wyGEZs-d=Ea2Vr z7CKfRLg=axO04u7oaGT4tO(2`31~zEtf}D5#)(9(5Qvaiu@EsMI~iFBl>)yQ)_;*u zY1VAykzX1GLrS=@)r&X4hHJ_$)B zSSq1KPzF>2^OGkb>JJBUMggbE&QkWjQ`DsNAeVMSdU+ za&qBf%&TC5P~=$l{#k{6#foCCk8nccL}QMbh$)vwXH|h@s}=SmhT{yuKdcR*A`EY< z;A@d9pvCX`>dv1$J)Co*?BJRQcM`zF#*a)!GSu06-X&;}IN>1)OZ@aA-hXf=f){^H zbpduSlb=F6-nlCOxvUl!oS=IF%B^}aXMDY1`Zvqvs@bSV@VQk#y439s2cx2~?Af3J3;Pwbb|%VzLTZ0{dVi#Q*>R From 1318f1a29b69e7d8d81572df70dba1a0422ffac9 Mon Sep 17 00:00:00 2001 From: Pascal Langer Date: Thu, 23 Nov 2017 15:51:07 +0100 Subject: [PATCH 118/121] S-FHSS failsafe again... --- Multiprotocol/Multiprotocol.h | 2 +- Multiprotocol/SFHSS_cc2500.ino | 28 ++++++++++++++++++---------- Multiprotocol/_Config.h | 6 +++--- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index 02e175e..e0e2fd4 100644 --- a/Multiprotocol/Multiprotocol.h +++ b/Multiprotocol/Multiprotocol.h @@ -19,7 +19,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 1 #define VERSION_REVISION 6 -#define VERSION_PATCH_LEVEL 27 +#define VERSION_PATCH_LEVEL 28 //****************** // Protocols //****************** diff --git a/Multiprotocol/SFHSS_cc2500.ino b/Multiprotocol/SFHSS_cc2500.ino index 7491cac..a0eed7b 100644 --- a/Multiprotocol/SFHSS_cc2500.ino +++ b/Multiprotocol/SFHSS_cc2500.ino @@ -156,16 +156,24 @@ static void __attribute__((unused)) SFHSS_build_data_packet() ch4 = convert_channel_16b_nolim(CH_AETR[ch_offset+3],2020,1020); if(command&0x04) - {//Failsafe data are coded for sbus: (ch_value-880)/0.625 - #ifndef SFHSS_FAILSAFE_THROTTLE - ch1=((ch1-880)<<3)/5; - ch2=((ch2-880)<<3)/5; - ch3=((ch3-880)<<3)/5; - if((command&0x08)==0) ch3|=0x800; // Special flag for throttle which appears on dumps... - ch4=((ch4-880)<<3)/5; + { //Failsafe data are: + // 0 to 1023 -> no output on channel + // 1024-2047 -> hold output on channel + // 2048-4095 -> channel_output=(data&0x3FF)*5/4+880 in µs + // Notes: + // 2048-2559 -> does not look valid since it only covers the range from 1520µs to 2160µs + // 2560-3583 -> valid for any channel values from 880µs to 2160µs + // 3584-4095 -> looks to be used for the throttle channel with values ranging from 880µs to 1520µs + #ifdef SFHSS_FAILSAFE_CH9_16 + ch1=((5360-ch1)<<2)/5; //((1520*2-ch1)<<2)/5+1856; + ch2=((5360-ch2)<<2)/5; + ch3=((5360-ch3)<<2)/5; + if((command&0x08)==0 && ch3<3072) // Throttle + ch3+=1024; + ch4=((5360-ch4)<<2)/5; #else - ch1=1024;ch2=1024;ch4=1024; // All channels centered - ch3=((command&0x08)==0)?0xF70:1024; // except throttle value set to 970 with 0x800 flag set + ch1=1024;ch2=1024;ch4=1024; // All channels hold their positions + ch3=((command&0x08)==0)?3664:1024; // except throttle value set to 980µs #endif } @@ -216,7 +224,7 @@ uint16_t ReadSFHSS() /* Work cycle: 6.8ms */ #define SFHSS_PACKET_PERIOD 6800 -#define SFHSS_DATA2_TIMING 1630 // original 1650 +#define SFHSS_DATA2_TIMING 1650 // Adjust this value between 1600 and 1650 if your RX(s) are not operating properly case SFHSS_DATA1: SFHSS_build_data_packet(); SFHSS_send_packet(); diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h index 11d1905..3071369 100644 --- a/Multiprotocol/_Config.h +++ b/Multiprotocol/_Config.h @@ -143,9 +143,9 @@ /**************************/ /*** FAILSAFE SETTINGS ***/ /**************************/ -//SHFSS failsafe is by default using the values of channels 9 to 16 -//You can uncomment the setting below to not use channels 9 to 16 but just bring down throttle -//#define SFHSS_FAILSAFE_THROTTLE +//SHFSS failsafe is by default set to all channels hold their positions except throttle forced to low (980µs) +//You can uncomment the setting below to use channels 9(1) to 16(8) instead +//#define SFHSS_FAILSAFE_CH9_16 #define AFHDS2A_FAILSAFE #ifdef AFHDS2A_FAILSAFE From 6bf873f4db1628a6d68c86514e2301b8ff1f3958 Mon Sep 17 00:00:00 2001 From: Pascal Langer Date: Thu, 23 Nov 2017 15:53:15 +0100 Subject: [PATCH 119/121] timing --- Multiprotocol/SFHSS_cc2500.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Multiprotocol/SFHSS_cc2500.ino b/Multiprotocol/SFHSS_cc2500.ino index a0eed7b..5846e85 100644 --- a/Multiprotocol/SFHSS_cc2500.ino +++ b/Multiprotocol/SFHSS_cc2500.ino @@ -224,7 +224,7 @@ uint16_t ReadSFHSS() /* Work cycle: 6.8ms */ #define SFHSS_PACKET_PERIOD 6800 -#define SFHSS_DATA2_TIMING 1650 // Adjust this value between 1600 and 1650 if your RX(s) are not operating properly +#define SFHSS_DATA2_TIMING 1630 // Adjust this value between 1600 and 1650 if your RX(s) are not operating properly case SFHSS_DATA1: SFHSS_build_data_packet(); SFHSS_send_packet(); From 9e8978166e3feccdcd5b3c3ec5056edaf76ec294 Mon Sep 17 00:00:00 2001 From: Pascal Langer Date: Thu, 23 Nov 2017 18:44:31 +0100 Subject: [PATCH 120/121] New CABELL protocol Protocol number: 34 sub_protocols: 0 CABELL_V3 1 CABELL_V3_TELEMETRY 6 CABELL_SET_FAIL_SAFE 7 CABELL_UNBIND --- Multiprotocol/CABELL_nrf224l01.ino | 442 +++++++++++++++++++++++++++++ Multiprotocol/Multi.txt | 1 + Multiprotocol/Multiprotocol.h | 16 +- Multiprotocol/Multiprotocol.ino | 10 +- Multiprotocol/Telemetry.ino | 4 +- Multiprotocol/Validate.h | 7 +- Multiprotocol/_Config.h | 8 +- Multiprotocol/_MyConfig.h | 1 + Protocols_Details.md | 55 ++-- 9 files changed, 518 insertions(+), 26 deletions(-) create mode 100644 Multiprotocol/CABELL_nrf224l01.ino diff --git a/Multiprotocol/CABELL_nrf224l01.ino b/Multiprotocol/CABELL_nrf224l01.ino new file mode 100644 index 0000000..4edab1f --- /dev/null +++ b/Multiprotocol/CABELL_nrf224l01.ino @@ -0,0 +1,442 @@ +/* + Protocol by Dennis Cabell, 2017 + KE8FZX + + To use this software, you must adhere to the license terms described below, and assume all responsibility for the use + of the software. The user is responsible for all consequences or damage that may result from using this software. + The user is responsible for ensuring that the hardware used to run this software complies with local regulations and that + any radio signal generated or received from use of this software is legal for that user to generate. The author(s) of this software + assume no liability whatsoever. The author(s) of this software is not responsible for legal or civil consequences of + using this software, including, but not limited to, any damages cause by lost control of a vehicle using this software. + If this software is copied or modified, this disclaimer must accompany all copies. + + This project is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +Multiprotocol is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Multiprotocol. If not, see . + */ + +// The Receiver for this protocol is available at: https://github.com/soligen2010/RC_RX_CABELL_V3_FHSS + +#if defined(CABELL_NRF24L01_INO) + +#include "iface_nrf24l01.h" + +#define CABELL_BIND_COUNT 2000 // At least 2000 so that if TX toggles the serial bind flag then bind mode is never exited +#define CABELL_PACKET_PERIOD 3000 // Do not set too low or else next packet may not be finished transmitting before the channel is changed next time around + +#define CABELL_NUM_CHANNELS 16 // The maximum number of RC channels that can be sent in one packet +#define CABELL_MIN_CHANNELS 4 // The minimum number of channels that must be included in a packet, the number of channels cannot be reduced any further than this +#define CABELL_PAYLOAD_BYTES 24 // 12 bits per value * 16 channels + +#define CABELL_RADIO_CHANNELS 9 // This is 1/5 of the total number of radio channels used for FHSS +#define CABELL_RADIO_MIN_CHANNEL_NUM 3 // Channel 0 is right on the boarder of allowed frequency range, so move up to avoid bleeding over +#define CABELL_TELEMETRY_PACKET_LENGTH 4 + +#define CABELL_BIND_RADIO_ADDR 0xA4B7C123F7LL + +#define CABELL_OPTION_MASK_CHANNEL_REDUCTION 0x0F +#define CABELL_OPTION_MASK_RECIEVER_OUTPUT_MODE 0x30 +#define CABELL_OPTION_SHIFT_RECIEVER_OUTPUT_MODE 4 +#define CABELL_OPTION_MASK_MAX_POWER_OVERRIDE 0x40 + +typedef struct +{ + enum RxMode_t : uint8_t + { // Note bit 8 is used to indicate if the packet is the first of 2 on the channel. Mask out this bit before using the enum + normal = 0, + bind = 1, + setFailSafe = 2, + normalWithTelemetry = 3, + telemetryResponse = 4, + unBind = 127 + } RxMode; + uint8_t reserved = 0; + uint8_t option; + /* mask 0x0F : Channel reduction. The number of channels to not send (subtracted from the 16 max channels) at least 4 are always sent + * mask 0x30>>4 : Receiver output mode + * 0 (00) = Single PPM on individual pins for each channel + * 1 (01) = SUM PPM on channel 1 pin + * 2 (10) = Future use. Reserved for SBUS output + * 3 (11) = Unused + * mask 0x40>>6 Contains max power override flag for Multi-protocol TX module. Also sent to RX + * mask 0x80>>7 Unused + */ + uint8_t modelNum; + uint8_t checkSum_LSB; + uint8_t checkSum_MSB; + uint8_t payloadValue [CABELL_PAYLOAD_BYTES] = {0}; //12 bits per channel value, unsigned +} CABELL_RxTxPacket_t; + +//----------------------------------------------------------------------------------------- +static uint8_t __attribute__((unused)) CABELL_getNextChannel (uint8_t seqArray[], uint8_t seqArraySize, uint8_t prevChannel) +{ + /* Possible channels are in 5 bands, each band comprised of seqArraySize channels + * seqArray contains seqArraySize elements in the relative order in which we should progress through the band + * + * Each time the channel is changes, bands change in a way so that the next channel will be in a + * different non-adjacent band. Both the band changes and the index in seqArray is incremented. + */ + prevChannel -= CABELL_RADIO_MIN_CHANNEL_NUM; // Subtract CABELL_RADIO_MIN_CHANNEL_NUM because it was added to the return value + if(prevChannel>(seqArraySize * 5)) + prevChannel=seqArraySize * 5; // Constrain the values just in case something bogus was sent in. + + uint8_t currBand = prevChannel / seqArraySize; + uint8_t nextBand = (currBand + 3) % 5; + + uint8_t prevChannalSeqArrayValue = prevChannel % seqArraySize; + uint8_t prevChannalSeqArrayPosition = 0; + for (int x = 0; x < seqArraySize; x++) + { // Find the position of the previous channel in the array + if (seqArray[x] == prevChannalSeqArrayValue) + prevChannalSeqArrayPosition = x; + } + uint8_t nextChannalSeqArrayPosition = prevChannalSeqArrayPosition + 1; + if (nextChannalSeqArrayPosition >= seqArraySize) + nextChannalSeqArrayPosition = 0; + + return (seqArraySize * nextBand) + seqArray[nextChannalSeqArrayPosition] + CABELL_RADIO_MIN_CHANNEL_NUM; // Add CABELL_RADIO_MIN_CHANNEL_NUM so we dont use channel 0 as it may bleed below 2.400 GHz +} + +//----------------------------------------------------------------------------------------- +#if defined CABELL_HUB_TELEMETRY +static void __attribute__((unused)) CABELL_get_telemetry() +{ + // calculate TX rssi based on past 250 expected telemetry packets. Cannot use full second count because telemetry_counter is not large enough + state++; + if (state > 250) + { + TX_RSSI = telemetry_counter; + telemetry_counter = 0; + state = 0; + telemetry_lost=0; + } + + // Process incoming telemetry packet of it was received + if (NRF24L01_ReadReg(NRF24L01_07_STATUS) & _BV(NRF24L01_07_RX_DR)) + { // data received from model + NRF24L01_ReadPayload(packet, CABELL_TELEMETRY_PACKET_LENGTH); + if ((packet[0] & 0x7F) == CABELL_RxTxPacket_t::RxMode_t::telemetryResponse) // ignore high order bit in compare because it toggles with each packet + { + RX_RSSI = packet[1]; // Packet rate 0 to 255 where 255 is 100% packet rate + v_lipo1 = packet[2]; // Directly from analog input of receiver, but reduced to 8-bit depth (0 to 255). Scaling depends on the input to the analog pin of the receiver. + v_lipo2 = packet[3]; // Directly from analog input of receiver, but reduced to 8-bit depth (0 to 255). Scaling depends on the input to the analog pin of the receiver. + telemetry_counter++; + if(telemetry_lost==0) + telemetry_link=1; + } + } + else + { + // If no telemetry packet was received then delay by the typical telemetry packet processing time + // This is done to try to keep the sendPacket process timing more consistent. Since the SPI payload read takes some time + delayMicroseconds(50); + } + NRF24L01_SetTxRxMode(TX_EN); + NRF24L01_FlushRx(); +} +#endif + +//----------------------------------------------------------------------------------------- +static void __attribute__((unused)) CABELL_send_packet(uint8_t bindMode) +{ + #if defined CABELL_HUB_TELEMETRY + if (!bindMode && (sub_protocol == CABELL_V3_TELEMETRY)) // check for incoming packet and switch radio back to TX mode if we were listening for telemetry + CABELL_get_telemetry(); + #endif + + CABELL_RxTxPacket_t TxPacket; + + uint8_t channelReduction = constrain((option & CABELL_OPTION_MASK_CHANNEL_REDUCTION),0,CABELL_NUM_CHANNELS-CABELL_MIN_CHANNELS); // Max 12 - cannot reduce below 4 channels + if (bindMode) + channelReduction = 0; // Send full packet to bind as higher channels will contain bind info + + uint8_t packetSize = sizeof(TxPacket) - ((((channelReduction - (channelReduction%2))/ 2)) * 3); // reduce 3 bytes per 2 channels, but not last channel if it is odd + uint8_t maxPayloadValueIndex = sizeof(TxPacket.payloadValue) - (sizeof(TxPacket) - packetSize); + + if ((sub_protocol == CABELL_UNBIND) && !bindMode) + { + TxPacket.RxMode = CABELL_RxTxPacket_t::RxMode_t::unBind; + TxPacket.option = option; + } + else + { + if (sub_protocol == CABELL_SET_FAIL_SAFE && !bindMode) + TxPacket.RxMode = CABELL_RxTxPacket_t::RxMode_t::setFailSafe; + else + { + if (bindMode) + TxPacket.RxMode = CABELL_RxTxPacket_t::RxMode_t::bind; + else + { + switch (sub_protocol) + { + case CABELL_V3_TELEMETRY: + TxPacket.RxMode = CABELL_RxTxPacket_t::RxMode_t::normalWithTelemetry; + break; + default: + TxPacket.RxMode = CABELL_RxTxPacket_t::RxMode_t::normal; + break; + } + } + } + TxPacket.option = (bindMode) ? (option & (~CABELL_OPTION_MASK_CHANNEL_REDUCTION)) : option; //remove channel reduction if in bind mode + } + TxPacket.reserved = 0; + TxPacket.modelNum = RX_num; + uint16_t checkSum = TxPacket.modelNum + TxPacket.option + TxPacket.RxMode + TxPacket.reserved; // Start Calculate checksum + + int adjusted_x; + int payloadIndex = 0; + uint16_t holdValue; + + for (int x = 0;(x < CABELL_NUM_CHANNELS - channelReduction); x++) + { + switch (x) + { + case 0 : adjusted_x = ELEVATOR; break; + case 1 : adjusted_x = AILERON; break; + case 2 : adjusted_x = RUDDER; break; + case 3 : adjusted_x = THROTTLE; break; + default : adjusted_x = x; break; + } + holdValue = map(limit_channel_100(adjusted_x),servo_min_100,servo_max_100,1000,2000); // valid channel values are 1000 to 2000 + if (bindMode) + { + switch (adjusted_x) + { + case THROTTLE : holdValue = 1000; break; // always set throttle to off when binding for safety + //tx address sent for bind + case 11 : holdValue = 1000 + rx_tx_addr[0]; break; + case 12 : holdValue = 1000 + rx_tx_addr[1]; break; + case 13 : holdValue = 1000 + rx_tx_addr[2]; break; + case 14 : holdValue = 1000 + rx_tx_addr[3]; break; + case 15 : holdValue = 1000 + rx_tx_addr[4]; break; + } + } + + // use 12 bits per value + if (x % 2) + { //output channel number is ODD + holdValue = holdValue<<4; + payloadIndex--; + } + else + holdValue &= 0x0FFF; + TxPacket.payloadValue[payloadIndex] |= (uint8_t)(holdValue & 0x00FF); + payloadIndex++; + TxPacket.payloadValue[payloadIndex] |= (uint8_t)((holdValue>>8) & 0x00FF); + payloadIndex++; + } + + for(int x = 0; x < maxPayloadValueIndex ; x++) + checkSum += TxPacket.payloadValue[x]; // Finish Calculate checksum + + TxPacket.checkSum_MSB = checkSum >> 8; + TxPacket.checkSum_LSB = checkSum & 0x00FF; + + // Set channel for next transmission + rf_ch_num = CABELL_getNextChannel (hopping_frequency,CABELL_RADIO_CHANNELS, rf_ch_num); + NRF24L01_WriteReg(NRF24L01_05_RF_CH,rf_ch_num); + + //NRF24L01_FlushTx(); //just in case things got hung up + //NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); + + uint8_t* p = reinterpret_cast(&TxPacket.RxMode); + *p &= 0x7F; // Make sure 8th bit is clear + *p |= (packet_count++)<<7; // This causes the 8th bit of the first byte to toggle with each xmit so consecutive payloads are not identical. + // This is a work around for a reported bug in clone NRF24L01 chips that mis-took this case for a re-transmit of the same packet. + + CABELL_SetPower(); + NRF24L01_WritePayload((uint8_t*)&TxPacket, packetSize); + + #if defined CABELL_HUB_TELEMETRY + if (!bindMode && (sub_protocol == CABELL_V3_TELEMETRY)) + { // switch radio to rx as soon as packet is sent + // calculate transmit time based on packet size and data rate of 1MB per sec + // This is done because polling the status register during xmit caused issues. + // bits = packst_size * 8 + 73 bits overhead + // at 250 Kbs per sec, one bit is 4 uS + // then add 140 uS which is 130 uS to begin the xmit and 10 uS fudge factor + delayMicroseconds(((((unsigned long)packetSize * 8ul) + 73ul) * 4ul) + 140ul) ; + packet_period = CABELL_PACKET_PERIOD + (constrain(((int16_t)(CABELL_NUM_CHANNELS - channelReduction) - (int16_t)6 ),(int16_t)0 ,(int16_t)10 ) * (int16_t)100); // increase packet period by 100 us for each channel over 6 + NRF24L01_WriteReg(NRF24L01_00_CONFIG, 0x0F); // RX mode with 16 bit CRC + } + else + #endif + packet_period = CABELL_PACKET_PERIOD; // Standard packet period when not in telemetry mode. +} + +//----------------------------------------------------------------------------------------- +static void __attribute__((unused)) CABELL_getChannelSequence (uint8_t outArray[], uint8_t numChannels, uint64_t permutation) +{ + /* This procedure initializes an array with the sequence progression of channels. + * This is not the actual channels itself, but the sequence base to be used within bands of + * channels. + * + * There are numChannels! permutations for arranging the channels + * one of these permutations will be calculated based on the permutation input + * permutation should be between 1 and numChannels! but the routine will constrain it + * if these bounds are exceeded. Typically the radio's unique TX ID should be used. + * + * The maximum numChannels is 20. Anything larger than this will cause the uint64_t + * variables to overflow, yielding unknown results (possibly infinite loop?). Therefor + * this routine constrains the value. + */ + uint8_t i; //iterator counts numChannels + uint64_t indexOfNextSequenceValue; + uint64_t numChannelsFactorial=1; + uint8_t sequenceValue; + + numChannels = constrain(numChannels,1,20); + + for (i = 1; i <= numChannels;i++) + { + numChannelsFactorial *= i; // Calculate n! + outArray[i-1] = i-1; // Initialize array with the sequence + } + + permutation = (permutation % numChannelsFactorial) + 1; // permutation must be between 1 and n! or this algorithm will infinite loop + + //Rearrange the array elements based on the permutation selected + for (i=0, permutation--; i i; indexOfNextSequenceValue--) + outArray[indexOfNextSequenceValue] = outArray[indexOfNextSequenceValue-1]; + + // Copy the selected value into it's new array slot + outArray[i] = sequenceValue; + } +} + +//----------------------------------------------------------------------------------------- +static void __attribute__((unused)) CABELL_setAddress() +{ + uint64_t CABELL_addr; + + // Serial.print("NORM ID: ");Serial.print((uint32_t)(CABELL_normal_addr>>32)); Serial.print(" ");Serial.println((uint32_t)((CABELL_normal_addr<<32)>>32)); + + if (IS_BIND_DONE_on) + { + CABELL_addr = (((uint64_t)rx_tx_addr[0]) << 32) + + (((uint64_t)rx_tx_addr[1]) << 24) + + (((uint64_t)rx_tx_addr[2]) << 16) + + (((uint64_t)rx_tx_addr[3]) << 8) + + (((uint64_t)rx_tx_addr[4])); // Address to use after binding + } + else + CABELL_addr = CABELL_BIND_RADIO_ADDR; // Static addr for binding + + CABELL_getChannelSequence(hopping_frequency,CABELL_RADIO_CHANNELS,CABELL_addr); // Get the sequence for hopping through channels + rf_ch_num = CABELL_RADIO_MIN_CHANNEL_NUM; // Initialize the channel sequence + + packet_count=0; + + uint64_t CABELL_Telemetry_addr = ~CABELL_addr; // Invert bits for reading so that telemetry packets have a different address. + + NRF24L01_WriteRegisterMulti(NRF24L01_0A_RX_ADDR_P0, reinterpret_cast(&CABELL_Telemetry_addr), 5); + NRF24L01_WriteRegisterMulti(NRF24L01_0B_RX_ADDR_P1, reinterpret_cast(&CABELL_Telemetry_addr), 5); + NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, reinterpret_cast(&CABELL_addr), 5); +} + +//----------------------------------------------------------------------------------------- +static void __attribute__((unused)) CABELL_init() +{ + NRF24L01_Initialize(); + CABELL_SetPower(); + NRF24L01_SetBitrate(NRF24L01_BR_250K); // slower data rate gives better range/reliability + NRF24L01_WriteReg(NRF24L01_01_EN_AA, 0x00); // No Auto Acknowledgment on all data pipes + NRF24L01_SetTxRxMode(TX_EN); //Power up and 16 bit CRC + + CABELL_setAddress(); + + NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); + NRF24L01_FlushTx(); + NRF24L01_FlushRx(); + NRF24L01_WriteReg(NRF24L01_02_EN_RXADDR, 0x01); + NRF24L01_WriteReg(NRF24L01_11_RX_PW_P0, 0x20); // 32 byte packet length + NRF24L01_WriteReg(NRF24L01_12_RX_PW_P1, 0x20); // 32 byte packet length + NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, 0x03); + NRF24L01_WriteReg(NRF24L01_04_SETUP_RETR, 0x5F); // no retransmits + NRF24L01_Activate(0x73); // Activate feature register + NRF24L01_WriteReg(NRF24L01_1C_DYNPD, 0x3F); // Enable dynamic payload length on all pipes + NRF24L01_WriteReg(NRF24L01_1D_FEATURE, 0x04); // Enable dynamic Payload Length + NRF24L01_Activate(0x73); + prev_power = NRF_POWER_0; +} + +//----------------------------------------------------------------------------------------- +static void CABELL_SetPower() // This over-ride the standard Set Power to allow an flag in option to indicate max power setting + // Note that on many modules max power may actually be worse than the normal high power setting + // test and only use max if it helps the range +{ + if(IS_BIND_DONE_on && !IS_RANGE_FLAG_on && ((option & CABELL_OPTION_MASK_MAX_POWER_OVERRIDE) != 0)) + { // If we are not in range or bind mode and power setting override is in effect, then set max power, else standard power logic + if(prev_power != NRF_POWER_3) // prev_power is global variable for NRF24L01; NRF_POWER_3 is max power + { + uint8_t rf_setup = NRF24L01_ReadReg(NRF24L01_06_RF_SETUP); + rf_setup = (rf_setup & 0xF9) | (NRF_POWER_3 << 1); + NRF24L01_WriteReg(NRF24L01_06_RF_SETUP, rf_setup); + prev_power=NRF_POWER_3; + } + } + else + NRF24L01_SetPower(); +} + +//----------------------------------------------------------------------------------------- +uint16_t CABELL_callback() +{ + if (IS_BIND_DONE_on) + { + CABELL_send_packet(0); // packet_period is set/adjusted in CABELL_send_packet + return packet_period; + } + if (bind_counter == 0) + { + BIND_DONE; + CABELL_init(); // non-bind address + } + else + { + CABELL_send_packet(1); + bind_counter--; + } + return CABELL_PACKET_PERIOD; +} + +//----------------------------------------------------------------------------------------- +uint16_t initCABELL(void) +{ + if (IS_BIND_DONE_on) + bind_counter = 0; + else + bind_counter = CABELL_BIND_COUNT; + CABELL_init(); + #if defined CABELL_HUB_TELEMETRY + init_frskyd_link_telemetry(); + telemetry_lost=1; // do not send telemetry to TX right away until we have a TX_RSSI value to prevent warning message... + #endif + + packet_period = CABELL_PACKET_PERIOD; + + return packet_period; +} + +#endif diff --git a/Multiprotocol/Multi.txt b/Multiprotocol/Multi.txt index 9d499cf..99260cd 100644 --- a/Multiprotocol/Multi.txt +++ b/Multiprotocol/Multi.txt @@ -31,3 +31,4 @@ 31,Q303,Q303,CX35,CX10D,CX10WD 32,GW008 33,DM002 +34,CABELL,CAB_V3,C_TELEM,-,-,-,-,F_SAFE,UNBIND diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index e0e2fd4..835eb56 100644 --- a/Multiprotocol/Multiprotocol.h +++ b/Multiprotocol/Multiprotocol.h @@ -19,7 +19,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 1 #define VERSION_REVISION 6 -#define VERSION_PATCH_LEVEL 28 +#define VERSION_PATCH_LEVEL 29 //****************** // Protocols //****************** @@ -59,6 +59,7 @@ enum PROTOCOLS MODE_Q303 = 31, // =>NRF24L01 MODE_GW008 = 32, // =>NRF24L01 MODE_DM002 = 33, // =>NRF24L01 + MODE_CABELL = 34, // =>NRF24L01 }; enum Flysky @@ -196,6 +197,13 @@ enum Q303 CX10D = 2, CX10WD = 3, }; +enum CABELL +{ + CABELL_V3 = 0, + CABELL_V3_TELEMETRY = 1, + CABELL_SET_FAIL_SAFE= 6, + CABELL_UNBIND = 7, +}; #define NONE 0 #define P_HIGH 1 @@ -483,6 +491,7 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p -- Q303 31 GW008 32 DM002 33 + CABELL 34 BindBit=> 0x80 1=Bind/0=No AutoBindBit=> 0x40 1=Yes /0=No RangeCheck=> 0x20 1=Yes /0=No @@ -585,6 +594,11 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p -- CX35 1 CX10D 2 CX10WD 3 + sub_protocol==CABELL + CABELL_V3 0 + CABELL_V3_TELEMETRY 1 + CABELL_SET_FAIL_SAFE 6 + CABELL_UNBIND 7 Power value => 0x80 0=High/1=Low Stream[3] = option_protocol; diff --git a/Multiprotocol/Multiprotocol.ino b/Multiprotocol/Multiprotocol.ino index 8c32ebc..e634ef3 100644 --- a/Multiprotocol/Multiprotocol.ino +++ b/Multiprotocol/Multiprotocol.ino @@ -539,7 +539,7 @@ uint8_t Update_All() update_led_status(); #if defined(TELEMETRY) #if ( !( defined(MULTI_TELEMETRY) || defined(MULTI_STATUS) ) ) - if((protocol==MODE_FRSKYD) || (protocol==MODE_BAYANG) || (protocol==MODE_HUBSAN) || (protocol==MODE_AFHDS2A) || (protocol==MODE_FRSKYX) || (protocol==MODE_DSM) ) + if( (protocol==MODE_FRSKYD) || (protocol==MODE_BAYANG) || (protocol==MODE_HUBSAN) || (protocol==MODE_AFHDS2A) || (protocol==MODE_FRSKYX) || (protocol==MODE_DSM) || (protocol==MODE_CABELL) ) #endif TelemetryUpdate(); #endif @@ -988,6 +988,12 @@ static void protocol_init() remote_callback = DM002_callback; break; #endif + #if defined(CABELL_NRF24L01_INO) + case MODE_CABELL: + next_callback=initCABELL(); + remote_callback = CABELL_callback; + break; + #endif #endif } } @@ -1310,7 +1316,7 @@ void pollBoot() #if defined(TELEMETRY) void PPM_Telemetry_serial_init() { - if( (protocol==MODE_FRSKYD) || (protocol==MODE_HUBSAN) || (protocol==MODE_AFHDS2A) || (protocol==MODE_BAYANG) ) + if( (protocol==MODE_FRSKYD) || (protocol==MODE_HUBSAN) || (protocol==MODE_AFHDS2A) || (protocol==MODE_BAYANG) || (protocol==MODE_CABELL) ) initTXSerial( SPEED_9600 ) ; if(protocol==MODE_FRSKYX) initTXSerial( SPEED_57600 ) ; diff --git a/Multiprotocol/Telemetry.ino b/Multiprotocol/Telemetry.ino index e91413b..8997161 100644 --- a/Multiprotocol/Telemetry.ino +++ b/Multiprotocol/Telemetry.ino @@ -397,7 +397,7 @@ void frsky_link_frame() telemetry_link |= 2 ; // Send hub if available } else - if (protocol==MODE_HUBSAN||protocol==MODE_AFHDS2A||protocol==MODE_BAYANG) + if (protocol==MODE_HUBSAN||protocol==MODE_AFHDS2A||protocol==MODE_BAYANG||protocol==MODE_CABELL) { frame[1] = v_lipo1; frame[2] = v_lipo2; @@ -830,7 +830,7 @@ void TelemetryUpdate() #endif if((telemetry_link & 1 )&& protocol != MODE_FRSKYX) - { // FrSkyD + Hubsan + AFHDS2A + Bayang + { // FrSkyD + Hubsan + AFHDS2A + Bayang + Cabell frsky_link_frame(); return; } diff --git a/Multiprotocol/Validate.h b/Multiprotocol/Validate.h index f086a16..c8d4204 100644 --- a/Multiprotocol/Validate.h +++ b/Multiprotocol/Validate.h @@ -79,6 +79,7 @@ #undef Q303_NRF24L01_INO #undef GW008_NRF24L01_INO #undef DM002_NRF24L01_INO + #undef CABELL_NRF24L01_INO #endif //Make sure telemetry is selected correctly @@ -87,6 +88,7 @@ #undef AFHDS2A_FW_TELEMETRY #undef AFHDS2A_HUB_TELEMETRY #undef BAYANG_HUB_TELEMETRY + #undef CABELL_HUB_TELEMETRY #undef HUBSAN_HUB_TELEMETRY #undef HUB_TELEMETRY #undef SPORT_TELEMETRY @@ -100,6 +102,9 @@ #if not defined(BAYANG_NRF24L01_INO) #undef BAYANG_HUB_TELEMETRY #endif + #if not defined(CABELL_NRF24L01_INO) + #undef CABELL_HUB_TELEMETRY + #endif #if not defined(HUBSAN_A7105_INO) #undef HUBSAN_HUB_TELEMETRY #endif @@ -116,7 +121,7 @@ #if not defined(DSM_CYRF6936_INO) #undef DSM_TELEMETRY #endif - #if not defined(DSM_TELEMETRY) && not defined(SPORT_TELEMETRY) && not defined(HUB_TELEMETRY) && not defined(HUBSAN_HUB_TELEMETRY) && not defined(BAYANG_HUB_TELEMETRY) && not defined(AFHDS2A_HUB_TELEMETRY) && not defined(AFHDS2A_FW_TELEMETRY) && not defined(MULTI_TELEMETRY) && not defined(MULTI_STATUS) + #if not defined(DSM_TELEMETRY) && not defined(SPORT_TELEMETRY) && not defined(HUB_TELEMETRY) && not defined(HUBSAN_HUB_TELEMETRY) && not defined(BAYANG_HUB_TELEMETRY) && not defined(CABELL_HUB_TELEMETRY) && not defined(AFHDS2A_HUB_TELEMETRY) && not defined(AFHDS2A_FW_TELEMETRY) && not defined(MULTI_TELEMETRY) && not defined(MULTI_STATUS) #undef TELEMETRY #undef INVERT_TELEMETRY #endif diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h index 3071369..d7ac958 100644 --- a/Multiprotocol/_Config.h +++ b/Multiprotocol/_Config.h @@ -139,6 +139,7 @@ #define Q303_NRF24L01_INO #define GW008_NRF24L01_INO #define DM002_NRF24L01_INO +#define CABELL_NRF24L01_INO /**************************/ /*** FAILSAFE SETTINGS ***/ @@ -212,7 +213,7 @@ const int8_t AFHDS2AFailsafe[14]= { #define AFHDS2A_HUB_TELEMETRY // Use FrSkyD Hub format to send telemetry to TX #define BAYANG_HUB_TELEMETRY // Use FrSkyD Hub format to send telemetry to TX #define HUBSAN_HUB_TELEMETRY // Use FrSkyD Hub format to send telemetry to TX - +#define CABELL_HUB_TELEMETRY // Use FrSkyD Hub format to send telemetry to TX /****************************/ /*** SERIAL MODE SETTINGS ***/ @@ -405,6 +406,11 @@ const PPM_Parameters PPM_prot[15]= { NONE MODE_DM002 NONE + MODE_CABELL + CABELL_V3 + CABELL_V3_TELEMETRY + CABELL_SET_FAIL_SAFE + CABELL_UNBIND */ // RX_Num is used for model match. Using RX_Num values different for each receiver will prevent starting a model with the false config loaded... diff --git a/Multiprotocol/_MyConfig.h b/Multiprotocol/_MyConfig.h index 1ab7c1f..f261014 100644 --- a/Multiprotocol/_MyConfig.h +++ b/Multiprotocol/_MyConfig.h @@ -20,4 +20,5 @@ // #undef Q303_NRF24L01_INO // #undef GW008_NRF24L01_INO // #undef DM002_NRF24L01_INO + // #undef CABELL_NRF24L01_INO #endif diff --git a/Protocols_Details.md b/Protocols_Details.md index e3dd1c0..e3dd6ad 100644 --- a/Protocols_Details.md +++ b/Protocols_Details.md @@ -382,14 +382,22 @@ Model: X16 AH Same channels assignement as above. -## DM002 - *33* -Autobind protocol +## Cabell - *34* +Homegrown protocol with variable number of channels (4-16) and telemetry. -**Only 2 TX IDs available, change RX_Num value 0-1 to cycle through them** +RXs details are located here: https://github.com/soligen2010/RC_RX_CABELL_V3_FHSS -CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11 ----|---|---|---|---|---|---|---|---|----|---- -A|E|T|R|FLIP|LED|CAMERA1|CAMERA2|HEADLESS|RTH|RATE_LOW +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14|CH15|CH16 +---|---|---|---|---|---|---|---|---|----|----|----|----|----|----|---- +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14|CH15|CH16 + +### Sub_protocol CABELL_V3 - *0* + +### Sub_protocol CABELL_V3_TELEMETRY - *1* + +### Sub_protocol CABELL_SET_FAIL_SAFE - *6* + +### Sub_protocol CABELL_UNBIND - *7* ## CG023 - *13* Autobind protocol @@ -471,21 +479,14 @@ CH5|CH6|CH7|CH8|CH9|CH10 ---|---|---|---|---|--- FLIP|MODE|PICTURE|VIDEO|HEADLESS|RTH -## Q2X2 - *29* -### Sub_protocol Q222 - *0* -Models: Q222 v1 and V686 v2 +## DM002 - *33* +Autobind protocol -CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12 ----|---|---|---|---|---|---|---|---|---|---|--- -A|E|T|R|FLIP|LED|MODULE2|MODULE1|HEADLESS|RTH|XCAL|YCAL +**Only 2 TX IDs available, change RX_Num value 0-1 to cycle through them** -### Sub_protocol Q242 - *1* and Q282 - *2* - -CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12 ----|---|---|---|---|---|---|---|---|---|---|--- -A|E|T|R|FLIP|LED|PICTURE|VIDEO|HEADLESS|RTH|XCAL|YCAL - -Model: JXD 509 is using Q282 with CH12=Start/Stop motors +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11 +---|---|---|---|---|---|---|---|---|----|---- +A|E|T|R|FLIP|LED|CAMERA1|CAMERA2|HEADLESS|RTH|RATE_LOW ## ESKY - *16* @@ -613,6 +614,22 @@ CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9 ---|---|---|---|---|---|---|---|--- A|E|T|R|FLIP||||HEADLESS +## Q2X2 - *29* +### Sub_protocol Q222 - *0* +Models: Q222 v1 and V686 v2 + +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12 +---|---|---|---|---|---|---|---|---|---|---|--- +A|E|T|R|FLIP|LED|MODULE2|MODULE1|HEADLESS|RTH|XCAL|YCAL + +### Sub_protocol Q242 - *1* and Q282 - *2* + +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12 +---|---|---|---|---|---|---|---|---|---|---|--- +A|E|T|R|FLIP|LED|PICTURE|VIDEO|HEADLESS|RTH|XCAL|YCAL + +Model: JXD 509 is using Q282 with CH12=Start/Stop motors + ## Q303 - *31* Autobind protocol From 4b32a93f27495dadd0adf8ee406b107d1935abd2 Mon Sep 17 00:00:00 2001 From: pascallanger Date: Thu, 23 Nov 2017 18:49:21 +0100 Subject: [PATCH 121/121] Update Protocols_Details.md --- Protocols_Details.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Protocols_Details.md b/Protocols_Details.md index e3dd6ad..6c130e5 100644 --- a/Protocols_Details.md +++ b/Protocols_Details.md @@ -383,7 +383,7 @@ Model: X16 AH Same channels assignement as above. ## Cabell - *34* -Homegrown protocol with variable number of channels (4-16) and telemetry. +Homegrown protocol with variable number of channels (4-16) and telemetry (RSSI, V1, V2). RXs details are located here: https://github.com/soligen2010/RC_RX_CABELL_V3_FHSS