Отправка байта из Raspberry Pi в Arduino с I2c & IoT для PWM

I am very new to the using both I2C and C# / Windows IoT so apologies up front if any of this is a dumb question. У меня есть Raspberry Pi 3 master и Arduino slave. Я пытаюсь отправить значение из слайдера на моей форме пользовательского интерфейса через I2C в Arduino, который я буду использовать для настройки моего ШИМ-цикла. Есть несколько вопросов, которые у меня есть, и не могу разобраться, если его Pi, Arduino или оба.

Вот мой раб Arduino код:

#include <Wire.h>
#define MyAddress 0x03

byte ReceivedData;
int pass;

void setup() {
    Wire.begin(MyAddress);
    Wire.onReceive(I2CReceived);
    Serial.begin(9600);
    //Wire.onRequest(I2CRequest);
}

void loop() {

    delay(100);
}

void I2CReceived(int NumberOfBytes)
{
    /* WinIoT have sent data byte; read it */
  byte ReceivedData = Wire.read();
  Serial.println(ReceivedData);
  if (ReceivedData <= 127){
      Serial.println("Equal or under");
      return;
  }else{
      Serial.println("over");
      return;
  }

}

И мой Пи мастер:

using System;
using Windows.Devices.Gpio;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Media;
using Windows.UI.Core;




using Windows.Devices.Enumeration;

using Windows.Devices.I2c;

using System.Diagnostics;

using System.Threading;

namespace I2COutput
{

    public sealed partial class MainPage : Page

    {


        private I2cDevice TransPump;

        private Timer periodicTimer;

        private const byte pump = 0x03;

        double pos;

        public MainPage()

        {

            InitializeComponent();

            initcomunica();

        }



        private async void initcomunica()

        {


            var pumpset = new I2cConnectionSettings(pump);


            pumpset.BusSpeed = I2cBusSpeed.StandardMode;

            string aqs = I2cDevice.GetDeviceSelector("I2C1");

            var dis = await DeviceInformation.FindAllAsync(aqs);


            TransPump = await I2cDevice.FromIdAsync(dis[0].Id, pumpset);


        }

        private async void SendChange()

        {
            byte[] sendpos;
            try
            {
               sendpos = BitConverter.GetBytes(pos);
                TransPump.Write(sendpos);
            }
            catch (Exception e)
            {
                Debug.WriteLine(e.Message);
            }

        }


        private void tempLbl_SelectionChanged(object sender, RoutedEventArgs e)
        {

        }

        private void slider_ValueChanged(object sender, RangeBaseValueChangedEventArgs e)
        {

            pos = slider.Value;
            temp2Lbl.Text = pos.ToString();
            Convert.ToInt16(pos);
            SendChange();

            return;

        }
    }
}

Первая проблема, которую я испытываю, заключается в том, что мой ReceivedDataна Arduino всегда 0 не имеет значения, какое значение sendposнаходится на Pi (да, оно меняется, когда я перемещаю ползунок).

Вторая проблема, которую я имею, это первый раз, когда ползунок перемещается, я получаю выход на последовательном Arduino, но затем ничего после. Если я сбрасываю или перезагружаю Arduino, я снова получаю выход начального изменения слайдера и ничего после.

Если что-то из этого слишком расплывчато или плохо объяснено, любая помощь или подталкивание в правильном направлении были бы очень признательны.

Спасибо заранее.

2 ответа

  1. вы должны изменить » провод.onReceive (I2CReceived); » to the loop because when it’s in the setup The arduino exute it only one, (извините за мой английский)

  2. Я написал I2C slave для Arduino UNO на основе веб-сайта Nick Gammon .
    Это сработало, но я не мог получить больше, чем 10 K байт /сек. У вас есть какая-то недостающая часть в вашем собственном коде.

    Вот урезанная версия кода Arduino

    #include <Wire.h>
    
    #define I2C_400K 1 // http://www.gammon.com.au/forum/?id=10896
    
    bool receiveEventcommandReceived = false;
    bool requestEventCommandReceived = false;
    
    int _currentRequestInputParameterLen = 0;
    
    void receiveEvent(int howMany) {
    
        receiveEventcommandReceived = true;
        while (Wire.available() > 0)
        {
            _cmd = Wire.read(); 
    
            if (_cmd == ArduinoCommand_EpromWrite) {
                // Some code
            }
            else if (_cmd == ArduinoCommand_EpromRead) {
    
                _addr0 = Wire.read();
                _addr1 = Wire.read();
                _addr  = (_addr0 * 256) + _addr1;
                _len   = Wire.read();
                _EEPROMBuffer = NusbioEx.EEPROMRead(_addr, _len);
                _r     = 128+1;
            }
            else {
                // Some code
            }
            _count++;
        }
    }
    
    void requestEvent()
    {
        requestEventCommandReceived = true;
    
        if (_cmd == ArduinoCommand_EpromRead) {
    
            Wire.write(_EEPROMBuffer, strlen(_EEPROMBuffer));
        }
        else { // ArduinoCommand_EpromWrite or any other api
    
            int v1 = _r >> 8;
            int v2 = _r & 0xFF;
    
            char buffer[2];
            buffer[0] = v1;
            buffer[1] = v2;
            Wire.write(buffer, 2); // MUST BE SENT IN ONE BUFFER -> TO CREATE ONE I2C TRANSACTION
        }
    }
    
    void SetupI2C() {
    
        Wire.begin(I2C_SLAVE_ADDR);                // join i2c bus with address #4
    
        #if I2C_400K
            TWBR = 12; // http://www.gammon.com.au/forum/?id=10896
        #endif
    
        Wire.onReceive(receiveEvent); // register event
        Wire.onRequest(requestEvent); // register event
    }
    
    void setup() {
        SetupI2C();
    }
    
    void loop() {
    
        if (requestEventCommandReceived) 
        {
            requestEventCommandReceived = false;
        }
        #endif
    }