ArduCopter Mega: порт на обычную Arduino (тестим)
Странно… Я не там скачивал. И название прошивки Arducopter2.0.38. Там совсем другая библиотека. Похоже это оригинальный у меня релиз, не Мегапиратовский. В их библиотеке совсем нет дефайнов на платы датчиков, у них же своя
/*
AP_ADC_ADS7844.cpp - ADC ADS7844 Library for Ardupilot Mega
Code by Jordi Mu�oz and Jose Julio. DIYDrones.com
Modified by John Ihlein 6 / 19 / 2010 to:
1)Prevent overflow of adc_counter when more than 8 samples collected between reads. Probably
only an issue on initial read of ADC at program start.
2)Reorder analog read order as follows:
p, q, r, ax, ay, az
This library is free software; you can redistribute it and / or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
External ADC ADS7844 is connected via Serial port 2 (in SPI mode)
TXD2 = MOSI = pin PH1
RXD2 = MISO = pin PH0
XCK2 = SCK = pin PH2
Chip Select pin is PC4 (33) [PH6 (9)]
We are using the 16 clocks per conversion timming to increase efficiency (fast)
The sampling frequency is 400Hz (Timer2 overflow interrupt)
So if our loop is at 50Hz, our needed sampling freq should be 100Hz, so
we have an 4x oversampling and averaging.
Methods:
Init() : Initialization of interrupts an Timers (Timer2 overflow interrupt)
Ch(ch_num) : Return the ADC channel value
// HJI - Input definitions. USB connector assumed to be on the left, Rx and servo
// connector pins to the rear. IMU shield components facing up. These are board
// referenced sensor inputs, not device referenced.
On Ardupilot Mega Hardware, oriented as described above:
Chennel 0 : yaw rate, r
Channel 1 : roll rate, p
Channel 2 : pitch rate, q
Channel 3 : x / y gyro temperature
Channel 4 : x acceleration, aX
Channel 5 : y acceleration, aY
Channel 6 : z acceleration, aZ
Channel 7 : Differential pressure sensor port
*/
extern “C” {
// AVR LibC Includes
#include <inttypes.h>
#include <avr/interrupt.h>
#include “WConstants.h”
}
#include “AP_ADC_ADS7844.h”
// Commands for reading ADC channels on ADS7844
static const unsigned char adc_cmd[9] = { 0x87, 0xC7, 0x97, 0xD7, 0xA7, 0xE7, 0xB7, 0xF7, 0x00 };
static volatile uint16_t _filter[8][ADC_FILTER_SIZE];
static volatile uint8_t _filter_index;
static unsigned char ADC_SPI_transfer(unsigned char data)
{
/* Wait for empty transmit buffer */
while ( !( UCSR2A & (1 << UDRE2)) );
/* Put data into buffer, sends the data */
UDR2 = data;
/* Wait for data to be received */
while ( !(UCSR2A & (1 << RXC2)) );
/* Get and return received data from buffer */
return UDR2;
}
ISR (TIMER2_OVF_vect)
{
uint8_t ch;
uint16_t adc_tmp;
//bit_set(PORTL,6); // To test performance
bit_clear(PORTC, 4); // Enable Chip Select (PIN PC4)
ADC_SPI_transfer(adc_cmd[0]); // Command to read the first channel
for (ch = 0; ch < 8; ch++){
adc_tmp = ADC_SPI_transfer(0) << 8; // Read first byte
adc_tmp |= ADC_SPI_transfer(adc_cmd[ch + 1]); // Read second byte and send next command
// Fill our Moving average filter
_filter[ch][_filter_index] = adc_tmp >> 3;
}
// increment our filter
_filter_index++;
// loop our filter
if(_filter_index == ADC_FILTER_SIZE)
_filter_index = 0;
bit_set(PORTC, 4); // Disable Chip Select (PIN PC4)
//bit_clear(PORTL,6); // To test performance
TCNT2 = 104; // 400 Hz
}
// Constructors ////////////////////////////////////////////////////////////////
AP_ADC_ADS7844::AP_ADC_ADS7844()
{
}
// Public Methods //////////////////////////////////////////////////////////////
void AP_ADC_ADS7844::Init(void)
{
pinMode(ADC_CHIP_SELECT, OUTPUT);
digitalWrite(ADC_CHIP_SELECT, HIGH); // Disable device (Chip select is active low)
// Setup Serial Port2 in SPI mode
UBRR2 = 0;
DDRH |= (1 << PH2); // SPI clock XCK2 (PH2) as output. This enable SPI Master mode
// Set MSPI mode of operation and SPI data mode 0.
UCSR2C = (1 << UMSEL21) | (1 << UMSEL20); // |(0 << UCPHA2) | (0 << UCPOL2);
// Enable receiver and transmitter.
UCSR2B = (1 << RXEN2) | (1 << TXEN2);
// Set Baud rate
UBRR2 = 2; // SPI clock running at 2.6MHz
// Enable Timer2 Overflow interrupt to capture ADC data
TIMSK2 = 0; // Disable interrupts
TCCR2A = 0; // normal counting mode
TCCR2B = _BV(CS21) | _BV(CS22); // Set prescaler of 256
TCNT2 = 0;
TIFR2 = _BV(TOV2); // clear pending interrupts;
TIMSK2 = _BV(TOIE2) ; // enable the overflow interrupt
}
// Read one channel value
int AP_ADC_ADS7844::Ch(unsigned char ch_num)
{
uint16_t result = 0;
//while(adc_counter[ch_num] < 2) { } // Wait for at least 2 samples in accumlator
// stop interrupts
cli();
// sum our filter
for(uint8_t i = 0; i < ADC_FILTER_SIZE; i++){
result += _filter[ch_num][i];
}
// resume interrupts
sei();
// average our sampels
result /= ADC_FILTER_SIZE;
return(result);
}
// Read one channel value
int AP_ADC_ADS7844::Ch_raw(unsigned char ch_num)
{
return _filter[ch_num][_filter_index]; // close enough
}
Пришу прощения за путаницу!
Это я маху дал, похоже, а у Вас правильная прошивка. Буду пробовать Вашу.
а у Вас правильная прошивка
А Вы на своей взлетели?
Нет. Я сейчас проводку к моторам переделываю.
А я в очередной раз возвращаюсь на В8 😃 Ну не летают у меня прошивки от Менно 😃
Желаю успеха! А мне просто интересно экспериментировать с прошивками. Пилот я пока аховый, и сюрпризы от неправильно понятых рекомендаций напрягают. Хочу досконально разобраться, а это проще делать сравнивая прошивки. И в скетче и на коптере. Пока в свободный полет отпускать не буду, погоняю опять на стенде, нужно убедиться, что не пропустил опять чего нибудь в железе.
Кстати, заказал радиолинк и сонар. Посмотрим, как дойдет с бесплатной доставкой. Сомнительно что то, но в других местах не нашел по приемлемой цене. Остается ЖПС и полностью буду укомплектован.
Мне тоже нравится колупаться. Но хочется уже полетать 😃
Я сегодня получил ГПС и АПЦ220. Поменял ГПС на АВТО, залил. Теперь не могу подключиться к планнеру. Пробовал старой версией и новой. Причем сетап проходит, а остальные режимы не работают. Опять поставил ГПС в NONE и ничего не изменилось.
Вот такой вот лог выдает:
Init ACM
RAM: 1233
FW Version 8
----------------------------------------
Init GyroMAVLink readpacket read error: The operation has timed out.
bps 0 loss 0 left 0
Mavlink Bad Packet (crc fail) len 0 crc 65535 pkno 0
**********IMU
----------------------------------------
Gyro offsets: -3628.00, -3628.00, -3628.00
Accel offsets: -3197.00, -3197.00, -3620.80
MAVLink readpacket read error: The operation has timed out.
bps 0 loss 0 left 0
Mavlink Bad Packet (crc fail) len 0 crc 65535 pkno 0
MAv Data: len 0 btr 0
MAVLink readpacket read error: The operation has timed out.
bps 0 loss 0 left 0
Mavlink Bad Packet (crc fail) len 0 crc 65535 pkno 0
MAVLink readpacket read error: The operation has timed out.
bps 0 loss 0 left 0
Mavlink Bad Packet (crc fail) len 0 crc 65535 pkno 0
MAVLink readpacket read error: The operation has timed out.
bps 0 loss 0 left 0
Mavlink Bad Packet (crc fail) len 0 crc 65535 pkno 0
MAVLink readpacket read error: The operation has timed out.
bps 0 loss 0 left 0
Mavlink Bad Packet (crc fail) len 0 crc 65535 pkno 0
MAv Data: len 0 btr 0
MAVLink readpacket read error: The operation has timed out.
Я думал ты уже сделал и летать пошел
Вот сейчас у нас в Москве 9 утра - я уже вернулся с поля 😁
И отчитываюсь - ОНО летает и ОНО висит.
- Летает: у нас небольшой ветерок, но плавненький такой, без особых порывов - просто дует и дует и дует. Коптер взлетает (по совету Сергея сразу к звездам не лезу) и на высоте метров полутора я смог (напоминать в очередной раз про свой отсутствующий пока опыт???) вполне адекватно улетать от себя и к себе, даже попытался описать круг. Тут, правда, произошла непонятка: я круг летел не блинчиком (то есть не только YAW’ом разворачивал аппарат, а еще и с небольшим диагональным наклоном градусов в 15-20 вперед и влево) - соответственно, довольно плавная дуга должна была получиться и она-таки получалась. До тех пор пока где-то после одной трети круга коптер вдруг не сделал на ровном месте (в смысле, ни порыва ветра не было, ни стики я не дергал) полный оверкиль и шмякнулся всеми четырьмя винтами в планету. Причем вошел он в эту свою странную траэкторию таким образом, что земли коснулся именно ВЕРТИКАЛЬНО ПЕРЕВЕРНУТЫМ ровненько так, что ни один проп не сломался!!! И пока я не убрал газ, коптер работал газонокосилкой 😛
Можно, конечно, списать на ошибки пилота - но я учусь. Хотя, повторяю, стики точно не дергал. Ладно, продолжаем летать. Сегодня практически не было падений (не считая только что описанного и еще одного, о котором ниже) - были взлеты и посадки, пусть и не идеальные, но это уже прогресс. Причем, я бы сказал, что прогресс коптера, а не пилота - с этой новой рамой мозги-то остались те же, а поведение совершенно другое в лучшую сторону. В общем - летает! Теперь, как завещал дедушка Ленин: учиться, учиться и еще раз… ну вы поняли!
- Висит: ну реально не висит “как прибитый”, покачивается (может на ветру?) и дрейфует (это уж точно ветер!). Опять же - может быть еще и “подушка”. Ибо испуганный прошлым опытом я сегодня выше полутора-двух метров не стал подниматься. Ну и… “какой же русский не любит быстрой езды”… тут уже писали, что пока не полетит в стабе другие режимы не трогать. Ну так оно же, типа, полетело? 😃 Так что я сегодня лоитер попробовал. Гуляет где-то в радиусе метров двух, а то и трех. Но помятуя о “точности” бытовых GPS навигаторов, я бы назвал это отличной работой. Что скажете? А еще мне понравилось в этом режиме управлять коптером - он, оказывается, вполне рулится и если не трогать газ, то роллом и питчем можно вполне себе тренироваться с разных стороно от коптера почти как в симуляторе: отрабатываем моторику в различных ориентациях летательного аппарата по отношению к пилоту… Так забавно, жалко телефона не взял с собой…
Правда, вот именно в этом режиме произошло второе втыкание в планету. То есть опять что-то глюкнуло и коптер завалился на бок. То ли высоты ему в этот раз не хватило, чтобы полностью перевернуться как в первый раз, то ли еще что-то - но минус один проп. Кстати, я заказал себе еще такие же (то есть набор из 12 пар разнонаправленных пропов) на RCtimer’е, ибо это явно “расходники” для начинаюего пилота… Вот что произошло - не знаю.
- И самое грустное: он висит. Да, я не опечатался, вы не ошиблись при чтении. Но на этот раз я говорю о другом висении. ОПЯТЬ за эти пол часа на поле коптер дважды(!!!) зависал. Слава Богу, что оба раза на земле. Я не знаю, есть ли тут закономерность и может быть он-таки в полете не станет подвисать, но, согласитесь, поднимать в воздух аппарат с таким вот непонятным глюком весьма стремно.
В первый раз это было так: я его посадил, ибо поблизости оказалась мамаша с открытой коляской и двигалась она в мою сторону. Так что я коптер посадил (не уронил! а посадил!) и сделал ему дизарминг. Когда же посторонние удалились на достаточное расстояние я попытался опять активировать моторы - но уже безуспешно. Только выключение питания ардуины помогло.
Второй раз был таким: я взлетел, коптер ветерком отнесло в сторону, я руками перенес его опять на стартовую позицию (при этом дизарминг не сделал, что, видимо, не вполне правильно с точки зрения техники безопасности, но длина лучей позволяет мне спокойно держать коптер за центральную часть сверху и при этом не попадать под винты, если бы они вдруг ожили). Так вот, отнес, поставил, даю газу - а фигушки…
😦
Когда я описывал подобные зависания дома (из-за чего, собственно, и обзавелся отдельным выключателем питания мозгов), то грешил на плату датчиков. И перевод платы с пятивольтового питания на трехвольтовое дал результат (как мне до сих пор казалось) и больше аппарат не зависал. И вдруг сегодня это произошло дважды, причем на улице. Ведь квадрик так мог запросто улететь в неизвестные дали, если бы завис на полных оборотах или хотя бы на том газу, когда уже идет на взлет… Где-то какой-то непропай, возможно. Но где? В ардуине? В плате All-in-One? Я не настолько хорошо владею паяльником, чтобы это найти и исправить. Увы! Так что вот думаю заказать БлэкВортекс. Чтобы, так сказать, успеть еще в этом сезоне полетать. Ну а зимой долгими вечерами можно будет и с этой конфигурацией попытаться разобраться…😵
Извините за “многА бокоФ”. Надеюсь, дочитали до конца?
ДОБАВЛЕНО:
Да, по уже сложившейся доброй традиции… И от всего сердца…
Хочу сказать Олегу Syberian’у огромное преогромное спасибо за прекрасно проделанную работу!
Олежка - ты наше всё!!!
Сам-то уже летаешь или как? А то в каком-то посте читал, что вроде бы нет… Ты это, давай, присоединяйся! Или я ошибаюсь и с этим все ОК? ну тогда превосходно!
ДОБАВЛЕНО-2: гм… а кто-то подскажет, как при ответе на другой пост не попадать опять в свой же недавно написанный? А то простыня какая-то получается… ну ладно - пока все в одном…
Кстати, заказал радиолинк и сонар. Посмотрим, как дойдет с бесплатной доставкой. Сомнительно что то, но в других местах не нашел по приемлемой цене. Остается ЖПС и полностью буду укомплектован.
Радиолинк пока не планирую, так как не очень понимаю его необходимость: просто чтобы не подключать коптер кабелем для настройки? А что, это так сложно воткнуть USB? Нет, я ни в коей мере не критикую этот вариант - я как раз с удовольствем им тоже воспользуюсь, если пойму зачем?. Буду благодарен за Вашу версию ответа на этот вопрос, нет, правда-правда…
А вот сонар есть, его необходимость вполне очевидна. Лежит себе давно уже и ждет, когда у моего тезки найдется на сонар время и силы. Но пока и без него есть чем заняться. А именно:
Мне тоже нравится колупаться. Но хочется уже полетать
- тут ни добавить, ни отнять, все как у меня 😃
Радиолинк, это телеметрия прежде всего. Нетрудно, конечно, подключить кабель, но гораздо удобнее без него. И получать с летящего борта информацию, для меня лично, важно.
для меня лично, важно.
тоже заказал себе =) а то где нить уронишь в поле по fpv и ищи его потом… а так на карту глянул и потопал куда надо
еще заказал с HK вот такой баззер так же для поисков, в те разы когда искал - приходилось винты запускать и слушать тарахтение (которое в общем то фиговато слышно на ветру)
ОНО летает
поздравляю =) welcome так сказать
Я баззер сам сляпал. Довольно противно пищит, но слышно его максимум метров с 10. Если ветра нет.
максимум метров с 10
ну вот, GPS ±5 метров и пищит метров на 10 - найти можно будет без проблем =)
Я баззер сам сляпал.
Я тоже хочу сделать такую штуку, только вот отсюда vrtp.ru/index.php?act=categories&CODE=article&arti…
Так и не разобрался почему могу подключиться к платке только в CLI моде. С APC тоже никак не могу начать работать, написал маленький сємпл - он работает
void setup()
{
Serial3.begin(57600);
}
void loop()
{
Serial3.print("Hello!");
Serial3.println(" My Robot");
delay(1000);
}
А с планнером никак не могу их подружить.
Олег Syberian, к Вам простой вопрос: нет ни желания. ни излишков финансов покупать платы типа “оллинван”, зато есть желание запилить платку с такими датчиками:
mkpochtoi.narod.ru/L3G4200D_gyro_ds.pdf - гиро
mkpochtoi.narod.ru/lsm303dlh_ds_16941.pdf - аксель с компасом.
Оба i2c, так что я так понимаю, придётся просто перепилить либы, которые работают с ними?
А с планнером никак не могу их подружить
А какая версия планера? У меня на 4Х каких-то было тоже самое. Решил обновлением планера на более свежую версию
А какая версия планера? У меня на 4Х каких-то было тоже самое. Решил обновлением планера на более свежую версию
Пробовал на разных планерах. 1.0.52 в том числе
В рекомендациях к 2.0.38 пишут, что нужно обновит планнер до версии 2.0.45. Не получается. Запускается обновление, чего то мельтешит , но после остановуи в планнере высвечивается все та же 1.0.30 билд какой то… Это в Мега планнере. А АПМ Мишн проапгрейдился жо версии 1.0.52 без проблем. Может кто знает, где лежит новый планер. Скачать чтоб сразу.
Извините за “многА бокоФ”.
По поводу “висения” - тут что-то с питанием, судя по всему. То ли датчиков, то ли ардуины. Очень странная вещь, ни разу не встречал у себя… Ни на ардуине, ни на вортексе.
так что я так понимаю, придётся просто перепилить либы
Придется, но “простым” это процесс я бы не назвал. Особенно весело подбирать множители рейтов и тасовать между собой оси в IMU.
Фух, ну разобрался со своими ошибками. Один из усиков allinone был сломан при креше. припаял назад и все заработало отлично. Не знаю почему это вызывало такие ошибки, но может и с зависание у SavosRU с этим тоже как-то связанно.
Олег, возможно ли запустить консоль используя APC? А то хочется откалибровать уровень, а в CLI моде APC работать не хочет. Спасибо!
я бы не назвал
имхо вполне простой =) только гемороя много: вбил делитель, залил, протестил и снова вбил делитель, залил, проестил
кстаии с L3G4200D небольшой баг с пирате, хз с чем связано - если резко крутить, то в определенный момент значение зашкаливает и коптер думает что он в наклоне (потихоньку конечно доплывает в сторону акселя), поэтому обратно itg3205 впаял - надоедает эксперементировать