Написание прошивки на C#

Тема в разделе "Arduino & Shields", создана пользователем Chicker, 26 авг 2015.

  1. Chicker

    Chicker Нуб

    Доброго времени суток. Задумал купить Arduino, пугает одно, изучение нового языка. Думаю из темы частично ясно, о чём хочу спросить. Существуют ли библиотеки позволяющие писать скетчи непосредственно на C# без участия стандартного языка Arduin`ы?

    З.Ы Заранее спасибо и прошу прощения если написал не в тот раздел....
     
  2. geher

    geher Гуру

    Для начала платы, совместимые с ардуиновской периферией, которые изначально рассчитаны на разработку на C#:
    http://amperka.ru/product/netduino-2
    http://amperka.ru/product/netduino-plus-2
    Правда я с ними не работал (и не собираюсь), потому о подводных камнях ничего не скажу. Разве замечу: следует учитывать, что платы рассчитаны на 3.3 В логику.

    Что же до программирования на C# обычной ардуины, то возникает вопрос, возможно ли вообще вместить в куцые флэш и ОЗУ МК ардуины программу на C#? Все-таки у этого языка есть особенности, требующие дополнительного расхода ОЗУ (а в случае ардуины и флэша, поскольку там хранится программа), ибо всегда порождается управляемый код.
     
    Chicker нравится это.
  3. AlexU

    AlexU Гуру

    Дело в том, что бинарник на основе C# -- это байт-код, который требует CLR (Common Language Runtime). Здесь можно провести аналогию с Java, где скомпилированные классы то же являются байт-кодом и требуют JVM (Java Virtual Machine).
    Из чего следует, что платы на базе AVR не подойдут.
    Хотя, если найдете реализацию CLR для AVR, которая сможет уместиться в память выбранного Вами контроллера, то....
     
    Chicker нравится это.
  4. ИгорьК

    ИгорьК Гуру

    А разве С шарп не есть развитие С? С чего бы это "ардуиновский язык" (С++) требовал изучения работающими на щарпе?
     
  5. Unixon

    Unixon Оракул Модератор

    C# - спи...я микрософтом Java со слегка измененным синтаксисом, своей VM и рантаймом.
     
  6. ИгорьК

    ИгорьК Гуру

    Ява тоже из С произрастает.
     
  7. Unixon

    Unixon Оракул Модератор

    К практике это имеет мало отношения, у Java/C#/<что угодно># и C/C++ очень разные экосистемы.
     
    Chicker нравится это.
  8. Chicker

    Chicker Нуб

    Спасибо всем за ответы.

    А про C# и С/С++, У них конечно много общего, но сами по себе, они разные у них даже логика программирования отличается, не говоря уже о логике построения кода, ключевых словах и операторах.
     
  9. Unixon

    Unixon Оракул Модератор

    Дело не в языке и его синтаксисе, а в машинерии для компиляции и исполнения кода.
     
  10. geher

    geher Гуру

    Логика программирования на C# срели прочего как раз определяется машинерией, поррждающей управляемый код, решающий многие вопросы за программиста и скрывающий от программиста некоторые аспекты, в частности речь идет о некоторых деталях работы с указателями.
    Программирование же на классическом C/C++ (бвз расширений, порождающих управляемый код) предполагает полный контроль за поведением порграммы, включая выделение и освобождение памяти.
     
  11. M0ln1a

    M0ln1a Гик

    А почему бы и не выучить? Я к примеру за несколько часов управился. Не думаю, что на C# можно сделать код таким же простым. Я его не учил, но попробуйте написать программку для терменвокса!
    На обычном Arduino код будет таким:
    Код (Text):

    // даём имена для пинов с пьезопищалкой (англ. buzzer) и фото-
    // резистором (англ. Light Dependent Resistor или просто LDR)
    #define BUZZER_PIN 3
    #define LDR_PIN A0

    void setup()
    {
    pinMode(BUZZER_PIN, OUTPUT);
    }

    void loop()
    {
    int val, frequency;
    val = analogRead(LDR_PIN);
    frequency = map(val, 0, 1023, 3500, 4500);
    tone(BUZZER_PIN, frequency, 20);
    }
    }
    А на NetDuino (C#):
    Код (Text):
    using System;
    using System.Net;
    using System.Net.Sockets;
    using System.Threading;
    using Microsoft.SPOT;
    using Microsoft.SPOT.Hardware;
    using SecretLabs.NETMF.Hardware;
    using SecretLabs.NETMF.Hardware.Netduino;
    namespace Theremin
    {
        public class Program
        {
            public static void Main()
            {
                AnalogInput ldr = new AnalogInput(AnalogChannels.ANALOG_PIN_A0);
                PWM buzzer = new PWM(PWMChannels.PWM_PIN_D3, 3000, 0.5, false);
                OutputPort[] leds = {
                    new OutputPort(Pins.GPIO_PIN_D9, false),
                    new OutputPort(Pins.GPIO_PIN_D8, false),
                    new OutputPort(Pins.GPIO_PIN_D10, false),
                    new OutputPort(Pins.GPIO_PIN_D7, false),
                    new OutputPort(Pins.GPIO_PIN_D11, false),
                    new OutputPort(Pins.GPIO_PIN_D6, false),
                    new OutputPort(Pins.GPIO_PIN_D12, false),
                    new OutputPort(Pins.GPIO_PIN_D5, false),
                    new OutputPort(Pins.GPIO_PIN_D13, false),
                    new OutputPort(Pins.GPIO_PIN_D4, false)
                };
                buzzer.Start();
                while (true)
                {
                    double darkness = ldr.Read();
                    buzzer.Frequency = 1000 + 3000 * darkness;
                    int segmentCount = (int)System.Math.Round(10.0 * darkness);
                    for (int i = 0; i < leds.Length; ++i)
                        leds[i].Write(i <= segmentCount);
                }
            }
        }
    }
    Мой вывод этому: Язык Arduino (НЕ C++!!!) интуитивно понятный и занимает меньше времени в написании. Да и статей и ответов на Ваши вопросы будет больше, если попробовать этот язык!
     
  12. Unixon

    Unixon Оракул Модератор

    Не существует в природе такой вещи как "язык Ардуино".
    То, что вы этими словами называете - это библиотека "Wiring", написанная на С++.
     
  13. M0ln1a

    M0ln1a Гик

    Ну да! Я знал что языка нет, но не помнил как называется эта библиотека...