c# и pwm

artemik
Offline
Зарегистрирован: 10.03.2012

Добрый день, форумчане. Кто может написать код на c# для pwm? Требуется регулировка яркости св. диода ползунком.  

maksim
Offline
Зарегистрирован: 12.02.2012

В смысле "написать код на c# для pwm" ?

leshak
Offline
Зарегистрирован: 29.09.2011

maksim пишет:

В смысле "написать код на c# для pwm" ?

Ну видимо нужно windoвое приложение, в котором есть ползунок. Двигая который должна менятся яркость светика на ардуине.

Но вопрос, конечно, задан "коряво".

Ну я могу написать, что дальше-то?

Что вы хотите, что-бы вам рассказали с какого бока подходить к этой задаче или что-бы выполнили эту работу за вас?

artemik
Offline
Зарегистрирован: 10.03.2012

да, приложение для винды. требуется ползунок и выбор ком-порта. если сможете написать код, то будет супер) если не хочется, то расскажите как послать значения от 0 до 255 в порт.

leshak
Offline
Зарегистрирован: 29.09.2011

artemik пишет:

да, приложение для винды. требуется ползунок и выбор ком-порта. если сможете написать код, то будет супер) если не хочется, то расскажите как послать значения от 0 до 255 в порт.

Неужели гугл на "C# serial port write" ничего не говорит?

     byte[] msgBuff = new []{NewServoPosition};
     _serialPort.Write(msgBuff, 0, msgBuff.Length);

 

leshak
Offline
Зарегистрирован: 29.09.2011

 Возможно и короче можно, ну нужно пробовать как сработает

_serialPort.Write(new []{NewPWM},0,1);

Естестенно NewPWM - толжна быть типа byte. Ну или "привести" к байту нужно будет. Нанисать (byte)NewPWM.

 

artemik
Offline
Зарегистрирован: 10.03.2012

сложновато))) я как второй день с с#) для моего примера где править?

leshak
Offline
Зарегистрирован: 29.09.2011

 В примере :) Где же еще. Скорее всего в обработчике события onchaned ползунка. 

Ну, естественно, перед этим нужно открыть порт, и не забывать его закрыть. По нажатию кнопки или выходе из приложения.

artemik
Offline
Зарегистрирован: 10.03.2012

 вот код, что за значение NewPWM?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            serial.Open();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            serial.Close();
        }

        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            trackBar.Minimum = 0;
            trackBar.Maximum = 255;
            serial.Write(new[] { NewPWM }, 0, 1);


        }

       

    }
}

 

artemik
Offline
Зарегистрирован: 10.03.2012

и код для дуины правилен?

int ledPin = 11;

void setup()  { 
  Serial.begin(9600);
} 

void loop()  { 
  if (Serial.available()){
    byte pwm = Serial.read();
     analogWrite(ledPin, pwm);         
  } 
 }

 

leshak
Offline
Зарегистрирован: 29.09.2011

 

artemik пишет:

вот код, что за значение NewPWM?

Ну вы задвали вопрос "как послать значения от 0 до 255". Если в ответе есть единственная непонятная вам переменная, то логично предположить что это и есть то самое передаваемое значение? ну или взять словарь и попробовать перевести имя этой переменной.

В вашем случае на ее месте должно быть то что вы хотите отослать. Скорее всего - текущая позиция вашего ползунка.

 

leshak
Offline
Зарегистрирован: 29.09.2011

artemik пишет:

и код для дуины правилен?


 

Не-а... дуина должна телепатически узнать что вы, снаружи, подключили светик? Вы где-то ей сказали что 11-тый пин должен работать на выход? pinMode()

artemik
Offline
Зарегистрирован: 10.03.2012

 с pinMode понял :), а вот прога не компилируется..

код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            serial.Open();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            serial.Close();
        }

        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            trackBar.Minimum = 0;
            trackBar.Maximum = 255;
            serial.Write(new[] {trackBar.Value}, 0, 1);


        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

       

    }
}

ошибки:

Ошибка 1 Наиболее подходящий перегруженный метод для "System.IO.Ports.SerialPort.Write(byte[], int, int)" имеет несколько недопустимых аргументов C:\Users\Work\AppData\Local\Temporary Projects\WindowsFormsApplication1\Form1.cs 33 13 WindowsFormsApplication1
Ошибка 2 Аргумент "1": преобразование типа из "int[]" в "byte[]" невозможно C:\Users\Work\AppData\Local\Temporary Projects\WindowsFormsApplication1\Form1.cs 33 26 WindowsFormsApplication1
 

 

artemik
Offline
Зарегистрирован: 10.03.2012

 всё, дружище спасибо! разобрался) преобразование типов забыл.

leshak
Offline
Зарегистрирован: 29.09.2011

А я предупреждал ;), что привести нужно будет ;)

Ладно, чудно что разобрались.

По хорошему нужно еще

1. Закрывать порт при выходе приложения (вдруг пользователь забыл нажать Close для порта)

2. Открытие порта и запись - обернуть в блоки try{}finally{}, что-бы корректно освобождать порт если "что-то пошло не так". И открытие/запись, по какой-то причине не удалась. Или try{}catch{} и выводить пользователю сообщению что "что-то у нас не вышло поработать с портом", а не сразу "опадать как озимые".

Если вообще "лоск" наводить, то можно еще, что-бы при старте, в setup(), ардуина сообщала "я готова". А на C# вначале ждать этого сообщения "о готовности". Уведомлять пользователя "устройство на связи" и только после этого начинать слать какие-то данные.

Да и, после приема данных, аруина может слать в ответ что-то типа "OK". Тогда C# будет знать что устройство "все еще слушает его, не умерло, не отсоединилось".

artemik
Offline
Зарегистрирован: 10.03.2012

 ого сколько тонкостей) если что обращусь.