Полагаю, вы пытаетесь записать значение 15, чтобы зажечь все светодиоды одновременно.Тем не менее, 15.to_s(2)
это "1111".Значение ASCII символа '1' равно 49, поэтому вместо записи 15, как только вы пишете 49 четыре раза в быстрой последовательности.
Следовательно, команда записи, которую вы ищете, вероятно, sp.putc(i)
.При этом записывается только один символ с заданным двоичным значением (= машиночитаемым для Arduino) вместо строкового представления ASCII значения, выраженного в двоичном (= читабельного для вас).
Таким образом, оставив все то же самое, замените цикл while
в своем коде Ruby на:
loop do
sp.putc(i)
puts 'Wrote: %d = %bb' % [ i, i ]
i = (i == 15) ? 0 : (i + 1)
sleep(10)
end
Если вы хотите прочитать ответы от Arduino, вы можете использовать, например, sp.gets
, чтобы получить одну строкутекста, например, попробуйте поместить puts 'Arduino replied: ' + sp.gets
в цикл перед sleep
(и один puts sp.gets
перед циклом, чтобы прочитать сообщение "Я онлайн", отправленное при первом установлении соединения).
Edit: Я только что заметил еще одну проблему в вашем коде на стороне Arduino: value = (incomingByte, DEC) % 16;
всегда приводит к значению 10, потому что (incomingByte, DEC)
имеет значение DEC
(что равно 10).Вы должны использовать value = incomingByte % 16;
вместо этого.Или полностью исключите value
и измените incomingByte
, например incomingByte %= 16;
.