Arduino и MatLab с OWI Robotic Arm Edge - Проблема с I2C
Я работаю над проектом, в котором хочу запрограммировать роботизированную руку в Arduino с помощью MatLab. Я использовал Arduino Uno с Adafruit Motor Shield V2.3 и комплектом OWI Robotic Arm Edge. Рычаг идеально собран и отлично работает со стандартным пультом дистанционного управления, который поставляется в комплекте. Все соединения с моторным экраном Adafruit установлены правильно, и экран припаян к контактам, которые соединяются с Uno.
Я абсолютно уверен, что физическая и электронная установка верна. Однако всякий раз, когда я пытаюсь переместить двигатели, прикрепленные к щиту, ни один из них не регистрируется. Ниже приведен мой код:
a = arduino('COM3', 'Uno', 'Libraries', 'Adafruit\MotorShieldV2')
shield = addon(a, 'Adafruit\MotorShieldV2')
addrs = scanI2CBus(a,0);
dcm = dcmotor(shield, 1);
dcm.Speed = 0.01;
start(dcm)
dcm2 = dcmotor(shield, 2);
dcm2.Speed = 0.2;
start(dcm2)
dcm3 = dcmotor(shield, 3);
dcm3.Speed = 0.2;
start(dcm3)
dcm4 = dcmotor(shield, 4);
dcm4.Speed = 0.2;
start(dcm4)
Я считаю, что проблема в третьей строке:
addrs = scanI2CBus(a,0);
Когда я запускаю код, щит имеет следующие свойства:
shield =
motorshieldv2 with properties:
Pins: A4(SDA), A5(SCL)
I2CAddress: 96 (0x60)
PWMFrequency: 1600 (Hz)
Таким образом, в то время как адрес I2C должен быть 0x60, фактическое значение переменной addrs
- это ячейка 2x1 вместо 0x60, как требует / указывает проект, как показано в рабочей области:
Я почти уверен, что именно по этой причине ни один из двигателей не регистрируется, но как я могу это исправить?
Заранее спасибо за любую помощь! Пожалуйста, дайте мне знать, если мне понадобится дополнительная информация.
@Malik, 👍1
1 ответ
Документация в MATLAB для scanI2CBus()
отмечает, что возвращаемое значение представляет собой массив ячеек символьных векторов
Они даже приводят пример:
a = arduino('COM9');
scanI2CBus(a,1)
с результатом:
ans =
'0x48'
Похоже, вам нужно будет разобрать массив ячеек в числовое значение или иным образом преобразовать его в число, возможно, используя функцию MATLAB hex2dec('hex_value').
- Драйвер двигателя L239D не может управлять двигателями
- Как заставить сервопривод вращаться на угол больше 180°
- Почему Adafruit motor shield не крутит моторы?
- Как управлять 4 двигателями постоянного тока с помощью Arduino?
- В чем разница между драйвером двигателя (motor driver) и щитом двигателя?
- Контроллер двигателя для двигателя 24 В, Arduino Uno
- Двигатель не работает при подключении к shield драйвера двигателя?
- Могу ли я подключить несколько устройств к одному контакту 5V и одному GND Arduino Uno R3
Спасибо вам за вашу помощь, я попробую, как только вернусь домой! Я также обязательно поделюсь своими результатами, надеюсь, я получу обратную связь от своих двигателей. Из любопытства, "разрешено" ли мне присваивать значение '0x60' переменной адреса I2C?, @Malik
Адрес I2C определяется устройством. Вероятно, он жестко запрограммирован на вашем датчике или может быть установлен аппаратными перемычками на датчике. Маловероятно, что вы сможете изменить его, просто присвоив переменной значение., @jose can u c
Я думаю, я выяснил, в чем причина дефекта - проблема с адресом I2C может быть связана с неправильной пайкой моторного экрана к самому Arduino; Я понял, что мощность моторного экрана мерцает и гаснет, так что это может быть причиной проблемы., @Malik
Не пытайтесь запитать моторный экран от Arduino., @jose can u c