vsulako / AFFBWheel

Arduino based racing wheel controller with force feedback
MIT License
102 stars 20 forks source link

AS5600 Arduino Leonardo #4

Closed mitiaborodada closed 2 years ago

mitiaborodada commented 2 years ago

Приветствую! Никак не хочет работать датчик AS5600 с Arduino Leonardo. Подключаю пины датчика SDA и SCL к пинам ардуино - RXI TX0 соответственно. В config.h прописываю:

define I2C_PIN_SDA 0

define I2C_PIN_SCL 1

Но ничего не работает, никакой реакции. Причём сам датчик работает на этой же ардуинке с проверочным кодом. Естественно, SDA и SCL подключаю к ардуино к соответствующим пинам SDA и SCL:

include

AS5600 encoder; int Wheel; void setup() { Serial.begin(115200); } void loop() { Wheel = encoder.getPosition(); Serial.println(Wheel); }

Уже голову сломал. Буду очень благодарен за помощь.

vsulako commented 2 years ago

Используете последний код прошивки? Ранее была проблема изза которой AS5600 не работал.

mitiaborodada commented 2 years ago

Да, скачивал буквально вчера. Вопрос снимается. Оказывается проблема была в самом датчике. Какая-то плавающая проблема была. Остался последний вопрос. Как мне использовать AS5600 на всех осях: руль + педали?

vsulako commented 2 years ago

Нет, должно работать и без всего остального. Попробуйте подключить к другим пинам. Строчки для энкодера комментировать не обязательно, они используются только если в STEER_TYPE указан ST_ENCODER.

mitiaborodada commented 2 years ago

Да, спасибо, всё получилось! Я исправил предыдущее свое сообщение. Остался последний вопрос. Как мне использовать AS5600 на всех осях: руль + педали?

vsulako commented 2 years ago

Датичк еще может не работать, если его подключить после старта (или в процессе работы у него пропадет питание), потому что при старте идет инициализация, а далее только опрос. В этой прошивке поддержка AS5600 планировалась только на оси руля. На педалях можно разве что вместо потенциометров поставить датчики Холла. а чтобы AS5600 ставить на педали и другие оси, понадобится доработка. AS5600 еще и не позволяет менять I2C адрес, так что понадобятся ухищрения - что-то вроде TCA9548, либо на каждый датчик хотя бы по отдельной SDA линии, либо что-то еще - а это будет много изменений и в подключениях, и в коде. А у меня всего один датчик, я даже попробовать не могу :)

vsulako commented 2 years ago

Вообще ведь у AS5600 есть еще аналоговый выход, так что дополнительные датчики можно подключать как потенциометры - выход OUT вместо среднего контакта потенциометра, на вход arduino или АЦП. Но я это не пробовал. Преимущество AS5600 как раз в том что он цифровой, и есть готовые модули. В аналоговом виде, думаю, не сильно будет отличаться от просто датчика Холла вроде OH49, SS495.

mitiaborodada commented 2 years ago

*Кстати, пробовал использовать 4 датчика с помощью TCA9548A (в свём проекте без ffb). Отлично всё работает.

Всё таки, что-то не так и не пойму пока источник проблемы. Вчера всего лишь перепаял другой провод на датчике. Подключаю к ардуинке и снова ничего не работает - никаких сигналов! Тут же заливаю тестовую прошивку, переключаю SDA и SCL на соответствующие пины Arduino SDA и SCL и вуаля - всё работает! Переключаю обратно и ничего не работает. Пробовал с другими пинами, тоже ничего не работает.

Гружу эту же прошивку на Arduino Micro - работает. Скорее всего проблема с TX/RX ардуинки. Хотя скетчи то прогружаются.

Ещё помучаюсь с этим датчиком и наверное буду переходить на обычный энкодер.

vsulako commented 2 years ago

Есть предположение. Попробуйте в файле bb_i2c.cpp сверху изменить 4 строчки:

#define I2C_SDA_LOW   {pinModeFast(I2C_PIN_SDA, OUTPUT);__builtin_avr_delay_cycles(4);}
#define I2C_SDA_HIGH  {pinModeFast(I2C_PIN_SDA, INPUT);__builtin_avr_delay_cycles(4);}
#define I2C_SCL_LOW   {pinModeFast(I2C_PIN_SCL, OUTPUT);__builtin_avr_delay_cycles(4);}
#define I2C_SCL_HIGH  {pinModeFast(I2C_PIN_SCL, INPUT);__builtin_avr_delay_cycles(4);}

и посмотреть не заработает ли.

mitiaborodada commented 2 years ago

Да, всё получилось! Спасибо огромное! Вроде понял в чём была проблема. У меня датчики на 3,3 вольта. Я изначально подключал их к Arduino micro через преобразователь напряжения на 3.3 вольта. Всё работало без проблем, но на leonardo при подключении к пину 3.3 вольта и к RX TX работает не стабильно. Можно сказать, что вообще не работает. Даже с преобразователем не захотел запускаться. Но на свой страх и риск попробовал на 5 вольт подключить и о чудо, заработал на leonardo! Но лучше всё таки на 3.3. В итоге с вашими последними рекомендациями заработало на leonardo на 3.3 вольта, как и положено.

Теперь хочу попробовать помучиться подключить AS5600 через TCA9548A (руль+педали) и КПП по двум проводам (на каждую кнопку у меня резистор добавлен), опять же, если получится.

Ещё раз, большое спасибо!

vsulako commented 2 years ago

Код в последнем сообщении увеличивает задержки при обмене по I2C, я предложил его для диагностики. Если работает и без него, то лучше задержки (__builtin_avr_delay_cycles) убрать. Я был уверен что AS5600 (белый квадратный модуль) работает от 5в, так как контакт VCC соединен с первой ножкой чипа, и сразу его подключал к 5в. А оказывается, еще и со второй. Надо подумать что с этим делать. Вообще говоря, у меня он на леонардо и на 3.3в работает, но в руле promicro, там преобразователя 3.3 нет. TCA9548A у меня нет в наличии, с ним помочь не могу. Для минимизации проблем можно повесить его на пины для аппаратного i2c и использовать готовые библиотеки. Код работы с осями педалей, по моему, должен быть вполне понятен, если что - спрашивайте.

vsulako commented 2 years ago

Нашел - чтобы безопасно подключать модуль AS5600 к 5в, надо убрать резистор R1 (0ом).

mitiaborodada commented 2 years ago

Докладываю! Действительно, 1 и 2 ноги микросхемы соединены резистором 0 Ом При его удалении датчик можно питать от 5 вольт. НО!!!!! У меня всё равно не хочет работать с дефолтовыми настройками:

define I2C_SDA_LOW {pinModeFast(I2C_PIN_SDA, OUTPUT);}

define I2C_SDA_HIGH {pinModeFast(I2C_PIN_SDA, INPUT);}

define I2C_SCL_LOW {pinModeFast(I2C_PIN_SCL, OUTPUT);}

define I2C_SCL_HIGH {pinModeFast(I2C_PIN_SCL, INPUT);}

Работает только с этими:

define I2C_SDA_LOW {pinModeFast(I2C_PIN_SDA, OUTPUT);__builtin_avr_delay_cycles(4);}

define I2C_SDA_HIGH {pinModeFast(I2C_PIN_SDA, INPUT);__builtin_avr_delay_cycles(4);}

define I2C_SCL_LOW {pinModeFast(I2C_PIN_SCL, OUTPUT);__builtin_avr_delay_cycles(4);}

define I2C_SCL_HIGH {pinModeFast(I2C_PIN_SCL, INPUT);__builtin_avr_delay_cycles(4);}

Я не знаю где косяк! Может Ардуинка такая попалась, может сам датчик бракованный.

Ну да ладно, главное работает, пусть и с такими настройками.

Как подключить датчики вместо резисторов, в принципе понятно - настроить AS5600 на работу через выход OUT вместо среднего контакта потенциометра. Это проверю.

vsulako commented 2 years ago

Тут вот в чем дело. Я работаю с i2c устройствами через ручную манипуляцию пинами, так получается быстрее, и можно брать любые пины. Но не все устройства могут работать достаточно быстро, поэтому приходится немного притормозить обмен, кое-где вставляя задержки. Я подобрал задержки под свои устройства, предполагая что все они одинаковые. Видимо, нет. Предложенный код добавляет задержку в 4 такта на каждое действие с i2c. Попробуйте поуменьшать в нем значение для __builtin_avr_delay_cycles, от 4 до 1.

mitiaborodada commented 2 years ago

Уменьшил задержку с 4 сразу до 1 - работает - так и оставлю! Видимо это особенность моих устройств, в первую очередь моего экземпляра Arduino Leonardo, т.к. на микро всё работает по дефолту.

mitiaborodada commented 2 years ago

Удалось реализовать педали на датчике AS5600 вместо резисторов. Удалил на плате датчиков 2 резистора: R1 (0 Ом) и R4

mitiaborodada commented 2 years ago

Приветствую! Я не знаю, что у меня происходит с датчиком AS5600, но он перестал работать на руле. (заказал себе TLE, посмотрю как он будет себя вести) Суть в том, что AS5600 в один прекрасный день просто перестал реагировать на поворот магнита. Вообще никакие показания не считывает, как будто датчик мертв. Причём за день до этого было всё нормально. При этом, заливаю тестовый скетч и просто "перетыкиваю" коннекторы SDA и SCL датчика на соответствующие пины Leonardo - датчик работает. Всё четко считывает. Что за магия, понять не могу!

Может есть какие-то идеи? И попутный вопрос. Как можно использовать в вашей программе родные пины Arduino Leonardo SDA и SCL ?

include

AS5600 encoder; int Wheel; void setup() { Serial.begin(115200); } void loop() { Wheel = encoder.getPosition(); Serial.println(Wheel); }

vsulako commented 2 years ago

А задержки о которых тут речь выше, есть? которые __builtin_avr_delay_cycles забыл их добавить, может, вы обновили прошивку?

если использовать "родные" i2c пины, то надо бы добавлять и "родной" i2c. Примерно так: ищем код

#if STEER_TYPE == ST_AS5600
  #include "bb_i2c.h"
  #include "multiturn.h"

  AS5600_BBI2C AS5600;
  MultiTurn MT;

  #define SETUP_WHEEL_SENSOR setupAS5600();
  #define GET_WHEEL_POS (MT.setValue((AS5600.readAngle()-2048)<<(STEER_BITDEPTH-12)))
  #define CENTER_WHEEL MT.zero();

  void setupAS5600()
  {
     AS5600.begin();
  }
#endif

и меняем на

#if STEER_TYPE == ST_AS5600
  #include <AS5600.h>
  #include "multiturn.h"
  AS5600 encoder;

  MultiTurn MT;

  #define SETUP_WHEEL_SENSOR
  #define GET_WHEEL_POS (MT.setValue((encoder.getPosition()-2048)<<(STEER_BITDEPTH-12)))
  #define CENTER_WHEEL MT.zero();

#endif

В работе не проверено, просто поменял соответственно вашему коду. И еще придется освободить пины 2 и 3, так как они и есть "родные" SCL/SDA (те которые выведены отдельно на Leonardo - это они же), если на них что-то будет - будет мешать.

mitiaborodada commented 2 years ago

Семён Семёныч, точно! Я же обновился, а про эти настройки забыл. Причём после обновления датчик какое-то время работал, а потом просто "сдох". Спасибо тебе, добрый человек!