簡體   English   中英

使用I2c和IoT將字節從Raspberry Pi發送到Arduino以實現PWM

[英]Sending Byte from Raspberry Pi to Arduino With I2c & IoT for PWM

我對同時使用I2C和C#/ Windows IoT感到很陌生,因此如果對此有任何疑問,請提前道歉。 我有一個Raspberry Pi 3主站和Arduino從站。 我試圖通過I2C從UI窗體上的滑塊向Arduino發送一個值,該值將用於調整PWM占空比。 我遇到了兩個問題,如果是Pi,Arduino或兩者都無法解決。

這是我的Arduino Slave代碼:

#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;
  }

}

還有我的Pi大師:

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;

        }
    }
}

我遇到的第一個問題是,無論Pi上sendpos的值是sendpos ,我在Arduino上的ReceivedData始終為0(是的,當我移動滑塊時,它確實會改變)。

我遇到的第二個問題是第一次移動滑塊時,我在Arduino串行上獲得了輸出,但之后什么也沒有。 如果我重置或重新加載了Arduino,那么我會再次獲得初始滑塊的輸出,此后什么也沒有。

抱歉,如果其中任何一個內容過於含糊或解釋不充分,請向正確的方向提供幫助或微調。

提前致謝。

您必須更改“ Wire.onReceive(I2CReceived);” 進入循環,因為在設置時arduino僅將其退出,(對不起我的英語)

我基於Nick Gammon網站為Arduino UNO編寫了一個I2C從設備。 它可以工作,但是我不能超過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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM