1. Уважаемый Гость! При написании вопросов в раздел форума [ArduCopter] Вопросы, проблемы и решения обязательно придерживаться шаблона сообщения, оговоренного в правилах раздела! Если сообщение не будет оформлено должным образом, то и ответ на вопрос будет с наименьшим приоритетом. Старайтесь дать максимально полную информацию по вашей проблеме, чтобы можно было более детально рассматривать вопрос!
    Скрыть объявление
  2. Уважаемый Гость! Хотите получать кэшбэк с покупок в online-магазинах? Сервис "Zozi.ru" дает такую возможность!
    Скрыть объявление
  3. Друзья! Для нашего ресурса необходим дополнительный объем пространства в облаке Dropbox. Подробнее.
    Скрыть объявление

Arduino и AVR (Atmel) микроконтроллеры

Тема в разделе "Наши другие увлечения", создана пользователем raefa, 9 мар 2016.

Реклама. Купить это место.
  1. raefa

    raefa Главнокомандующий Команда форума

    Регистрация:
    3 янв 2015
    Сообщения:
    4.324
    Город:
    Zhigulevsk
    Имя:
    Александр
    Последнее редактирование: 19 окт 2017
  2. AEROBATICS

    AEROBATICS Студент

    Регистрация:
    1 апр 2015
    Сообщения:
    76
    Город:
    Москва
    Имя:
    Дмитрий
    Вопрос простой и наверное в чём-то дилетантский, но всё же.
    Хочется слить прошивку с Атмеги 328P, но беда в том, что выставлены лок биты. Ни код, ни данные не читаются, кроме конфигов согласно скрина.
    Вопрос такой:
    Смогу-ли я слить дамп, если производитель включил лок биты? Ну к примеру при снятии галок (распрограммировании лок бит фьюзов) и заливке в МК только конфигурации лок бит фьюзов снимется защита? Если нет, что я крайне подозреваю, то как можно обойти защиту?
    Оснащён цифровым осциллографом и анализатором цифрового сигнала (могу прослушать порты), но даст-ли это мне что-либо?
    Спасибо парни!
     
    5yoda5 нравится это.
  3. 5yoda5

    5yoda5 Master Команда форума

    Регистрация:
    29 янв 2015
    Сообщения:
    7.137
    Город:
    Реж
    Имя:
    Тимур
    Ох, непростой это вопрос, а дилетантский он только для тех, кто в этом уже разобрался (я-нет).
    Думаю, лучше всего сначала потренироваться "на кошечках". Возьмем нечто имеющееся в наличии (например Ардуино нано или вообще минимОСД), и смодулируем ситуацию. Зальем туда например прошивку контроллера подвеса с установкой фьюзов и потом попробуем сделать то что вами запланировано. В этом случае у нас есть "право на ошибку", и мы не потеряем прошивку (или данные еепром), если "что-то пойдет не так".
    А если всё пройдет гладко - тогда уже "шмалять боевыми" (всмысле делать то же самое на целевом МК).

    Но что-то мне подсказывает, что тут не всё так просто. Может быть при снятии этого бита прошивка перестанет правильно читаться и станет бесполезным мусором. Она допустим считается (неправильно, но это не видно сразу), мы её зальем куда-нибудь, поставим те же биты - но это уже будет каша из байтов, а не машинный код. Вспомним как долго китайцы не могли склонировать оригинальные 8-битные (на тот момент) контроллеры подвеса у Москаленко (ака АлексМос). И до сих пор, существует только несколько "нуллед" версий прошивки, а не весь "модельный ряд" (хотя 8-битные контроллеры уже вышли из моды, так как сам Москаленко выложил уже "хакнутую" последнюю прошивку для этих КП).

    С интересом прочитаю про ваши изыскания.
     
  4. zheka_CPU

    zheka_CPU Абитуриент

    Регистрация:
    27 авг 2017
    Сообщения:
    14
    Город:
    кемерово
    Имя:
    Евгений
    скажите из за чего у меня вот это вот вылетает окно при запуске avrdud Снимок экрана (7).png
     
    Последнее редактирование модератором: 31 авг 2017
  5. raefa

    raefa Главнокомандующий Команда форума

    Регистрация:
    3 янв 2015
    Сообщения:
    4.324
    Город:
    Zhigulevsk
    Имя:
    Александр
    Похоже проблемы с драйвером ft232.
     
  6. An_private

    An_private Старший научный сотрудник

    Регистрация:
    6 июн 2016
    Сообщения:
    595
    Город:
    Санкт-Петербург
    Имя:
    Андрей Коробейников
    Простой, простой :) Берём datasheet и читаем:
    The Lock bits can only be erased to “1” with the Chip Erase command.
    То есть снять лок без полной очистки содержимого памяти - невозможно.
    PS: извините, не сразу заметил дату поста, но всё равно не удержался :)
     
  7. Marksheider

    Marksheider Научный сотрудник

    Регистрация:
    1 дек 2016
    Сообщения:
    332
    Город:
    Прокопьевск
    Имя:
    Артем
    Сижу изобретаю очередной велосипед.
    Строю стенд и нужно сделать весы для замера тяги, вроде даже все получается.
    Но есть такая проблемка, вес показывается хорошо и достаточно точно.
    DSC00793.JPG
    При надавливании число которое показывает граммы увеличивается в числе значащих разрядов вот так.
    DSC00794.JPG
    И когда отпускаешь нагрузку чтоб значения вернулись обратно к нулю получается вот такая засада. как погасить ненужные цифры???
    DSC00795.JPG
    то бишь 3 последних знака это вторая точка четыре и ноль последний??? Я с arduino пока на ВЫ потому не могу понять что нужно сделать в коде для этого. Эти цифры просто стоят и не меняются.

    Код:
    #include "HX711.h" // библиотека тензодатчика
    #include <Wire.h> // не знаю что это за хрень.
    #include <LiquidCrystal_I2C.h> // Библиотека дисплея
    HX711 scale(A1, A0);                        
    
    float calibration_factor = -14.4;// калибровочная константа тензодатчика
    float units;
    float ounces;
    
    LiquidCrystal_I2C lcd(0x3F,16,2);  // Устанавливаем дисплей
    
    void setup()
    {
      scale.set_scale();
      scale.tare();                              //Сбрасываем на 0
      scale.set_scale(calibration_factor);       //Применяем калибровку
    
      lcd.init();  // инициализация ЖК дисплея                  
      lcd.backlight();// Включаем подсветку дисплея
    
      lcd.setCursor(5, 0);// перевод курсора на строку 1, символ 5
      lcd.print("Thrust");// Пишем Тяга
      lcd.setCursor(11, 1);// перевод курсора на строку 2, символ 11
      lcd.print("Gramm");//пишем Грамм
    }
    
    void loop()
    {
      for(int i = 0;i < 10; i ++) units =+ scale.get_units(), 10;   // усредняем показания считав 10 раз
      units / 10;                                                   // делим на 10
      
      ounces = units * 0.035274;                                    // переводим унции в граммы            
    
      // Устанавливаем курсор на вторую строку и нулевой символ.
      lcd.setCursor(3, 1);
      // Выводим на экран вес вграммах
      lcd.print(ounces);
      }
    
     
  8. An_private

    An_private Старший научный сотрудник

    Регистрация:
    6 июн 2016
    Сообщения:
    595
    Город:
    Санкт-Петербург
    Имя:
    Андрей Коробейников
    units / 10; // делим на 10
    Должно быть
    units /= 10;

    units =+ scale.get_units(), 10;
    должно быть
    units += scale.get_units();

    По основному вопросу:
    Дело в том, что стандартный print не умеет делать выравнивание. То есть он напечатает ровно столько символов, сколько есть в числе.
    Здесь есть два варианта решения.
    Первый, самый простой. Просто перед выводом значения выводить в то же место нужное количество пробелов. Недостаток - выравнивание будет по левой границе.
    Вариант второй. Использовать dtostrf. Это встроенная функция, которая преобразует число с плавающей запятой в строку в памяти по заданному формату. Дальше можно посмотреть - сколько она занимает места и выдать начиная с нужного знакоместа.
    Вариант третий. Так как десятые доли грамма вряд ли нужны в вашем случае, то просто преобразовать float в int16_t и выводить уже его.
     
    Marksheider нравится это.
  9. Marksheider

    Marksheider Научный сотрудник

    Регистрация:
    1 дек 2016
    Сообщения:
    332
    Город:
    Прокопьевск
    Имя:
    Артем
    Как что и куда надо прописать, а то я прям совсем на Вы...с программированием.
    без конкретного примера ни как...

    Кстати замечания исправил вес плавнее начал меняться...
     
  10. An_private

    An_private Старший научный сотрудник

    Регистрация:
    6 июн 2016
    Сообщения:
    595
    Город:
    Санкт-Петербург
    Имя:
    Андрей Коробейников
    Ага. Так как у вас никакого усреднения 10 значений просто не было :)
    Сейчас не могу детально расписывать. Может завтра :)
    Посмотрите пока мой код примерно такого же назначения - там есть примеры использования:
    https://github.com/Anprivate/engine_tester/blob/master/engine_tester.ino
     
  11. Marksheider

    Marksheider Научный сотрудник

    Регистрация:
    1 дек 2016
    Сообщения:
    332
    Город:
    Прокопьевск
    Имя:
    Артем
    По первому варианту работает если выводить три пробела после самого веса, но тогда затирается надпись Gramm .
     
  12. An_private

    An_private Старший научный сотрудник

    Регистрация:
    6 июн 2016
    Сообщения:
    595
    Город:
    Санкт-Петербург
    Имя:
    Андрей Коробейников
    хм, вроде я писал иное. Вам нужно написать:
    lcd.setCursor(0, 1);
    for(i=0;i<11;i++)lcd.print(" ");
    lcd.setCursor(3, 1);
    lcd.print(ounces);
    Но это паллиатив, конечно.
    Куда логичнее написать:
    char line2[17];
    dtostrf(ounces, 11, 1, line2);
    lcd.print(line2);
     
  13. Marksheider

    Marksheider Научный сотрудник

    Регистрация:
    1 дек 2016
    Сообщения:
    332
    Город:
    Прокопьевск
    Имя:
    Артем
    Вы какую то прям мне высшую математику написали. Сижу разбираюсь что куда.
    у меня вот так в общем получилось, с int ом
    Код:
    void loop()
    {
      for(int i = 0;i < 10; i ++) units += scale.get_units(), 10; // усредняем показания считав 10 раз
      units /= 10; // делим на 10
    
      ounces = units * 0.035274;// переводим унции в граммы 
                 
      if (ounces > 0.5) //если вес не ничтожно мал
      {
      lcd.setCursor(2, 1);// Устанавливаем курсор на вторую строку и второй символ.
      lcd.print((int)ounces);// Выводим на экран вес в целых граммах
      lcd.print(" ");//затираем последний знак пробелом
      }
      else //или
      {
      lcd.setCursor(2, 1);// Выставляем курсор...
      lcd.print(0);// Выводим ноль
      }
    }
     
  14. Marksheider

    Marksheider Научный сотрудник

    Регистрация:
    1 дек 2016
    Сообщения:
    332
    Город:
    Прокопьевск
    Имя:
    Артем
    В общем все вроде работает , Даж по русски научился писать на экранчике. но вот значение веса увеличивает разрядность с лева на право,
    DSC00796.JPG

    DSC00797.JPG
    Как то можно сделать чтоб ноль грамм стоял на месте цифры 1 и разрядность повышалась с права на лево??? А то получается большой пробел между цифрами и надписью грамм.
     
  15. An_private

    An_private Старший научный сотрудник

    Регистрация:
    6 июн 2016
    Сообщения:
    595
    Город:
    Санкт-Петербург
    Имя:
    Андрей Коробейников
    Это всё паллиатив - хождение по граблям. Это работает только пока у вас не будет изменения разрядности выводимого числа больше двух. То есть если после 100 выводится 90, то всё хорошо. А вот если после 100 выводится 1, то вы получите 1 0, так как затирается только одно знакоместо.
    Вам нужно сделать нормальный вывод с выравниванием по правому краю.
    Для вещественных чисел проще всего это сделать через dtostfr - там впрямую указывается количество знакомест.
    Если работаете с целыми числами, то стандартно это делается через sprintf, но жрёт много памяти. Либо через itoa вывести в строку в память, посмотреть длину получившейся строки и добить нужное количество пробелов слева.
     
  16. Marksheider

    Marksheider Научный сотрудник

    Регистрация:
    1 дек 2016
    Сообщения:
    332
    Город:
    Прокопьевск
    Имя:
    Артем
    Ладно, на первое время пойдет тест провести, буду дальше разбираться.

    Подскажите с высоты своего опыта, реально будет сделать на arduino uno полноценный стенд,
    Нужно будет обрабатывать измерения от :
    двух таходатчиков,
    измерителя тока
    напряжения
    тягу
    и все это пересчитать на мощность и эффективность ВМГ???
    И вывести все это , каждый показатель на 7 сегментные индикаторы на, дисплеи на микросхеме TM1637
     
  17. An_private

    An_private Старший научный сотрудник

    Регистрация:
    6 июн 2016
    Сообщения:
    595
    Город:
    Санкт-Петербург
    Имя:
    Андрей Коробейников
    Зачем? Обычные на отражение? С ними могут быть проблемы - они сильно "звенят" по выходу и при работе через прерывание могут сводить с ума другие части.
    Если не считать два таходатчика, то всё это уже реализовано в моём стенде, на код которого я давал ссылку. Только там тяга на LCD не выдаётся, но это сделать можно за полчаса.
     
  18. Marksheider

    Marksheider Научный сотрудник

    Регистрация:
    1 дек 2016
    Сообщения:
    332
    Город:
    Прокопьевск
    Имя:
    Артем
    А схему подключения как все собрано и из чего собрано можно посмотреть? Ну и прям интересно стало глянуть на весь стенд целиком.
    а чем таходатчики заменить можно? Я так понял если поставить магнитные на эффекте хола то нужно при смене моторов указывать количество магнитов.

    А куда выдается тяга? на компе обсчитываете?
     
  19. An_private

    An_private Старший научный сотрудник

    Регистрация:
    6 июн 2016
    Сообщения:
    595
    Город:
    Санкт-Петербург
    Имя:
    Андрей Коробейников
    http://forum.rcdesign.ru/blogs/249571/blog22911.html
    А зачем вам вообще обороты то? :)
    Никакой полезной информации они не несут.
     
  20. Marksheider

    Marksheider Научный сотрудник

    Регистрация:
    1 дек 2016
    Сообщения:
    332
    Город:
    Прокопьевск
    Имя:
    Артем
    Я смастерил стенд чтоб проверять соосную ВМГ, интересно знать на сколько повлияет на эффективность разница в оборотах этих моторов в связке.
    --- Сообщения объединены, 23 сен 2017 ---
    Прикольно я уже читал раньше вашу статью получается.
     
  21. An_private

    An_private Старший научный сотрудник

    Регистрация:
    6 июн 2016
    Сообщения:
    595
    Город:
    Санкт-Петербург
    Имя:
    Андрей Коробейников
    Хм, ну да, наверное.
    Можно попробовать сделать на отражающих. Но я бы поставил на это дело отдельную ардуинку - там обычно всё идёт на прерываниях и софтовый SPI, который используется в общении с HX711 может испортить всю малину :)
     
Реклама. Купить это место.