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, как требует / указывает проект, как показано в рабочей области:

Workspace

Я почти уверен, что именно по этой причине ни один из двигателей не регистрируется, но как я могу это исправить?

Заранее спасибо за любую помощь! Пожалуйста, дайте мне знать, если мне понадобится дополнительная информация.

, 👍1


1 ответ


1

Документация в MATLAB для scanI2CBus() отмечает, что возвращаемое значение представляет собой массив ячеек символьных векторов

Они даже приводят пример:

a = arduino('COM9');
scanI2CBus(a,1)

с результатом:

ans = 
            '0x48'

Похоже, вам нужно будет разобрать массив ячеек в числовое значение или иным образом преобразовать его в число, возможно, используя функцию MATLAB hex2dec('hex_value').

,

Спасибо вам за вашу помощь, я попробую, как только вернусь домой! Я также обязательно поделюсь своими результатами, надеюсь, я получу обратную связь от своих двигателей. Из любопытства, "разрешено" ли мне присваивать значение '0x60' переменной адреса I2C?, @Malik

Адрес I2C определяется устройством. Вероятно, он жестко запрограммирован на вашем датчике или может быть установлен аппаратными перемычками на датчике. Маловероятно, что вы сможете изменить его, просто присвоив переменной значение., @jose can u c

Я думаю, я выяснил, в чем причина дефекта - проблема с адресом I2C может быть связана с неправильной пайкой моторного экрана к самому Arduino; Я понял, что мощность моторного экрана мерцает и гаснет, так что это может быть причиной проблемы., @Malik

Не пытайтесь запитать моторный экран от Arduino., @jose can u c