<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel rdf:about="https://community.wolfram.com">
    <title>Community RSS Feed</title>
    <link>https://community.wolfram.com</link>
    <description>RSS Feed for Wolfram Community showing any discussions tagged with Connected Devices sorted by new.</description>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3563034" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3474215" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3460710" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3454636" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3445017" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3365621" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3314481" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3311950" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3294878" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3161083" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3119087" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3105676" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3025705" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3024384" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3016653" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/2714674" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/2680377" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/2623336" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/2602822" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/2565873" />
      </rdf:Seq>
    </items>
  </channel>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3563034">
    <title>Wolfram on NVIDIA DGX Spark</title>
    <link>https://community.wolfram.com/groups/-/m/t/3563034</link>
    <description>Has anyone been able to install and run Mathematica on NVIDIA&amp;#039;s new DGX Spark computer?  &#xD;
&#xD;
If yes, does CUDA work?  &#xD;
Does, NetTrain work?  &#xD;
Are you able to train models?</description>
    <dc:creator>David Laxer</dc:creator>
    <dc:date>2025-10-21T17:21:12Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3474215">
    <title>Cannot get DeviceOpen on OpenAIGym to work</title>
    <link>https://community.wolfram.com/groups/-/m/t/3474215</link>
    <description>Hi,&#xD;
&#xD;
I&amp;#039;m on Wolfram Home Edition 14.2.1 on macOS and I try to get OpenAIGym working as per the help page. The gym python package has been installed, but when I try to execute &#xD;
&#xD;
    env = DeviceOpen[&amp;#034;OpenAIGym&amp;#034;, &amp;#034;Atlantis-v0&amp;#034;]&#xD;
&#xD;
an error message in the Messages window appears saying that Python package cv2 is not installed. I have installed it as well using&#xD;
&#xD;
    ResourceFunction[&amp;#034;PythonPackageInstall&amp;#034;][&amp;#034;opencv-python&amp;#034;]&#xD;
&#xD;
Has anyone else gotten this device running on macOS. It seems also like the gym package is deprecated and further development happens in the package gymnasium.</description>
    <dc:creator>Thomas Gustafsson</dc:creator>
    <dc:date>2025-06-04T13:38:17Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3460710">
    <title>&amp;#034;Who are you?&amp;#034;: Asking machines to identify themselves with ASCII control characters.</title>
    <link>https://community.wolfram.com/groups/-/m/t/3460710</link>
    <description>&amp;amp;[Wolfram Notebook][1]&#xD;
&#xD;
&#xD;
  [1]: https://www.wolframcloud.com/obj/65e4af27-f068-4a98-bee5-c75d8ccdbce7</description>
    <dc:creator>Dimitar Krastev</dc:creator>
    <dc:date>2025-05-14T13:35:17Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3454636">
    <title>Multichannel audio recording?</title>
    <link>https://community.wolfram.com/groups/-/m/t/3454636</link>
    <description>Is it possible to make multichannel audio recordings (beyond stereo L/R) in Mathematica? I have a 4-channel audio interface (&amp;#034;Listen AudioConnect 4x4&amp;#034;) attached but am only getting single channel results.&#xD;
&#xD;
Context: As a retirement project I am making a test system for loudspeakers in which I make simultaneous measurements of response at different sensors (sound pressure, voltage, current, displacement) to a stimulus generated in Mathematica and synchronously played back on the same audio interface. I have done this in the past prior to the introduction of Audio, but it required using a Matlab toolbox (and MatLink, no longer supported) for the data acquisition. In the new system I would like to do this entirely within Mathematica, but I can&amp;#039;t seem to get enough input data channels to record.</description>
    <dc:creator>Daniel Warren</dc:creator>
    <dc:date>2025-05-03T19:31:15Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3445017">
    <title>[WEBINAR] Connecting digital models with industrial devices using the OPC UA library</title>
    <link>https://community.wolfram.com/groups/-/m/t/3445017</link>
    <description>![enter image description here][2]&#xD;
&#xD;
**April 23rd, 2025**: Wolfram U is hosting a webinar on Wolfram System Modeler&amp;#039;s OPC UA Library!&#xD;
&#xD;
Discover how you can connect your digital models with industrial devices such as PLCs, sensors, actuators and more.&#xD;
&#xD;
In this webinar, we will present the latest release of the OPC UA library, a System Modeler Library designed for real-time communication with OPC UA&amp;#x2013;enabled devices and systems. &#xD;
&#xD;
This library facilitates workflows such as testing control code through hardware-in-the-loop simulations, collecting and analyzing live data, deploying high-level control algorithms and creating custom control panels. By connecting models with physical systems in real time, it unlocks exciting possibilities in industrial automation, control development and data analysis.&#xD;
&#xD;
&amp;gt;[**REGISTER HERE**][3]&#xD;
&#xD;
![enter image description here][4]&#xD;
&#xD;
&#xD;
  [2]: https://community.wolfram.com//c/portal/getImageAttachment?filename=OPC-Event-WU.png&amp;amp;userId=1522613&#xD;
  [3]: https://www.bigmarker.com/wolfram-u/opc-ua-library?utm_bmcr_source=wsm-events-page&#xD;
  [4]: https://community.wolfram.com//c/portal/getImageAttachment?filename=WolframU.png&amp;amp;userId=1522613</description>
    <dc:creator>Ankit Naik</dc:creator>
    <dc:date>2025-04-16T14:24:24Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3365621">
    <title>How mathematica interfacing with PYNQ-Z2 board</title>
    <link>https://community.wolfram.com/groups/-/m/t/3365621</link>
    <description>To run the Mathematica runtime directly on the PYNQ board, you’ll have to cross-compile Wolfram libraries for ARM.&#xD;
&#xD;
Wolfram Mathematica does not natively provide ARM-compatible libraries (libWolframRTL.so) for ARM platforms such as the PYNQ board. The libraries provided by Wolfram are typically built for x86-64 Linux systems, which causes the architecture mismatch when you try to use the ARM cross-compiler (arm-linux-gnueabihf-gcc).&#xD;
&#xD;
In this, ARM-compatible libraries from Wolfram are required. Or please provide a custom solution or suggest alternatives.</description>
    <dc:creator>Vijaya Babu Panthagani</dc:creator>
    <dc:date>2025-01-28T13:59:01Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3314481">
    <title>Interactive NAO V5 robot programming: movement, problem solving &amp;amp; AI</title>
    <link>https://community.wolfram.com/groups/-/m/t/3314481</link>
    <description>![Interactive NAO V5 robot programming: movement, problem solving &amp;amp; AI][1]&#xD;
&#xD;
&amp;amp;[Wolfram Notebook][2]&#xD;
&#xD;
&#xD;
  [1]: https://community.wolfram.com//c/portal/getImageAttachment?filename=Main05112024.png&amp;amp;userId=20103&#xD;
  [2]: https://www.wolframcloud.com/obj/243dab72-d8b6-4da4-9813-1b4b384e6599</description>
    <dc:creator>Terence Smith</dc:creator>
    <dc:date>2024-11-04T21:02:22Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3311950">
    <title>Stream audio from Google Chrome tab in Windows 11 24H2</title>
    <link>https://community.wolfram.com/groups/-/m/t/3311950</link>
    <description>Hello,  &#xD;
I successfully use streaming from $DefaultAudioInputDevice.&#xD;
&#xD;
    audio0 = AudioStream[$DefaultAudioInputDevice, SampleRate -&amp;gt; 7119, &#xD;
       SoundVolume -&amp;gt; 1];&#xD;
    AudioRecord[audio0];&#xD;
    Pause[180]&#xD;
    AudioStop[audio0];&#xD;
&#xD;
In future I want to stream audio from Google Chrome Tab.  &#xD;
Please, what device do I need to use?&#xD;
&#xD;
Regards - Leo</description>
    <dc:creator>Leo Baumann</dc:creator>
    <dc:date>2024-10-30T18:03:29Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3294878">
    <title>Why do I have different temperature data on Micro:bit and Mathematica?</title>
    <link>https://community.wolfram.com/groups/-/m/t/3294878</link>
    <description>Hello,&#xD;
&#xD;
I am playing with Micro:bit and Mathematica. I wanted to simply visualize current temperature (measuring constantly) in Mathematica with temperature sensor on Micro:bit. I have programmed Micro:bit and wrote a code in Mathematica using Dynamic and ThermometherGauge function to do the visualization. It works, but I noticed that data showing in MakeCode is different (and more accurate) than the data showing in Mathematica. And I can be sure that the temperature showing in Mathematica is wrong because 32ºC is not possible currently and it never changes. And the gauge is constantly showing 10 then 50 and then 32ºC. I do not know why is that. &#xD;
&#xD;
Code for Micro:bit in JavaScript:&#xD;
&#xD;
    let temp = 0&#xD;
    basic.forever(function () {&#xD;
    	&#xD;
    })&#xD;
    basic.forever(function () {&#xD;
        // Get the temperature in Celsius&#xD;
        temp = input.temperature()&#xD;
        // Write temperature to serial as a number&#xD;
        serial.writeNumber(temp)&#xD;
        // Write a newline to ensure proper reading&#xD;
        serial.writeLine(&amp;#034;&amp;#034;)&#xD;
        // Wait for 2 seconds before sending next value&#xD;
        basic.pause(2000)&#xD;
    })&#xD;
    &#xD;
Mathematica:&#xD;
&#xD;
    Dynamic[temp = DeviceRead[microbit] ] &#xD;
     Dynamic[ThermometerGauge[temp, {0, 50}, ScaleOrigin -&amp;gt; 0, &#xD;
       GaugeLabels -&amp;gt; &amp;#034;Temperature (°C)&amp;#034;]]&#xD;
&#xD;
Thanks in advance!</description>
    <dc:creator>Ivo P.</dc:creator>
    <dc:date>2024-10-09T15:00:48Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3161083">
    <title>AudioCapture and $AudioInputDevices never detect my microphone</title>
    <link>https://community.wolfram.com/groups/-/m/t/3161083</link>
    <description>My friend and I are both having the same problem. My microphone works fine in all other apps, except Mathematica can&amp;#039;t detect any input devices. Has anyone found a solution to this?&#xD;
&#xD;
Windows 11 Pro. Permissions for the microphone are set correctly.  I tried various devices.  Yes, the drivers are up to date.  Again, but me and my friend are having the same issue on separate computers.&#xD;
&#xD;
I have v14 he has v13.3</description>
    <dc:creator>Sam B</dc:creator>
    <dc:date>2024-04-19T20:31:05Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3119087">
    <title>Ultrasonic Radar with Arduino and Wolfram Language</title>
    <link>https://community.wolfram.com/groups/-/m/t/3119087</link>
    <description>![enter image description here][1]&#xD;
&#xD;
&amp;amp;[Wolfram Notebook][2]&#xD;
&#xD;
&#xD;
  [1]: https://community.wolfram.com//c/portal/getImageAttachment?filename=3539hero.png&amp;amp;userId=20103&#xD;
  [2]: https://www.wolframcloud.com/obj/f9223055-9ef0-4858-bd08-f2284fe5b1fd</description>
    <dc:creator>Marcel Pelletier</dc:creator>
    <dc:date>2024-02-09T01:19:05Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3105676">
    <title>Mathematica doesn&amp;#039;t find my USB microphone</title>
    <link>https://community.wolfram.com/groups/-/m/t/3105676</link>
    <description>My USB microphone shows up in the PulseAudio volume control and also works well with Audacity, arecord etc.&#xD;
&#xD;
However, Mathematica can&amp;#039;t see the mic -- $AudioInputDevices gives me a null list.&#xD;
&#xD;
How can I set up the mic to work as an audio input device in Mathematica?&#xD;
&#xD;
(Raspberry Pi OS Bookworm )&#xD;
&#xD;
Thanks, &#xD;
Praveen</description>
    <dc:creator>Praveen Bharadhwaj</dc:creator>
    <dc:date>2024-01-19T04:18:27Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3025705">
    <title>How to specify the install directory for Arduino with the Device property &amp;#034;ArduinoInstallLocation&amp;#034;?</title>
    <link>https://community.wolfram.com/groups/-/m/t/3025705</link>
    <description>Using the following code to connect to the Arduino board, the following window will be shown, which requires the installation of the Arduino software.&#xD;
&#xD;
    arduino = DeviceOpen[&amp;#034;Arduino&amp;#034;, &amp;#034;COM3&amp;#034;];&#xD;
&#xD;
![enter image description here][1]&#xD;
&#xD;
But because I have already installed the Arduino IDE software, I want to define its installation Path with  the Device property &amp;#034;ArduinoInstallLocation&amp;#034; so I use the following code:&#xD;
&#xD;
    arduino = DeviceOpen[&amp;#034;Arduino&amp;#034;, {&amp;#034;COM3&amp;#034;,&amp;#034;ArduinoInstallLocation&amp;#034; -&amp;gt; &amp;#034;C:\\Program Files\\Arduino IDE&amp;#034;}];&#xD;
&#xD;
But it doesn&amp;#039;t work for me.&#xD;
![enter image description here][2]&#xD;
Please Help! I need to specify the installation path of Arduino Software.&#xD;
&#xD;
&#xD;
  [1]: https://community.wolfram.com//c/portal/getImageAttachment?filename=1.png&amp;amp;userId=3025416&#xD;
  [2]: https://community.wolfram.com//c/portal/getImageAttachment?filename=2.png&amp;amp;userId=3025416</description>
    <dc:creator>Harry Hunt</dc:creator>
    <dc:date>2023-10-02T16:41:50Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3024384">
    <title>Arduino and Wolfram Mathematica dynamic plot</title>
    <link>https://community.wolfram.com/groups/-/m/t/3024384</link>
    <description>I am very frustrated with the slow transfer of data from the Arduino serial COM port to the PlotLine[] in dynamic function.  In the Arduino Plot Serial, data is drawn instantly. But when connected to WM with USB able, the plots are very very slow. About 10 and 20 to 1 speed.  The Arduino code is sending a 6 pair of integers in ASCI format.  Any suggestions as to how speed up.&#xD;
&#xD;
He Arduino sketch is this&#xD;
&#xD;
    #include &amp;lt;Wire.h&amp;gt;&#xD;
    #include &amp;#034;Adafruit_AS726x.h&amp;#034;&#xD;
    //create the object&#xD;
    Adafruit_AS726x ams;&#xD;
    &#xD;
    uint16_t sensorValues[AS726x_NUM_CHANNELS];&#xD;
    &#xD;
    void setup() {&#xD;
      Serial.begin(115200);&#xD;
      while (!Serial)&#xD;
      pinMode(LED_BUILTIN, OUTPUT);&#xD;
    &#xD;
    &#xD;
      //inicia y permite la comunicacion con el sensor&#xD;
      if (!ams.begin()) {&#xD;
        Serial.println(&amp;#034;could not connect to sensor! Please check your wiring.&amp;#034;);&#xD;
        while (1)&#xD;
          ;&#xD;
      }&#xD;
    }&#xD;
    void loop() {&#xD;
    &#xD;
      //temperature  sensor&#xD;
      //uint8_t temp = ams.readTemperature();&#xD;
    &#xD;
      //ams.drvOn(); // descomentar esto si quieres usar el led del sensor para hacer medidas&#xD;
      ams.startMeasurement();  //begin a measurement&#xD;
    &#xD;
      //permite que el sensor lea la data cuando este disponible&#xD;
      bool rdy = false;&#xD;
      while (!rdy) {&#xD;
        delay(5);&#xD;
        rdy = ams.dataReady();&#xD;
      }&#xD;
      //ams.drvOff(); //descomentar esto si quieres usar el led del sensor para hacer medidas&#xD;
    &#xD;
      //lee los valores!&#xD;
      ams.readRawValues(sensorValues);&#xD;
      //ams.readCalibratedValues(calibratedValues);&#xD;
    &#xD;
      //Serial.print(&amp;#034;{&amp;#034;);&#xD;
      //Serial.print(&amp;#034;Temp: &amp;#034;);&#xD;
      //Serial.print(temp);&#xD;
      //Serial.print(&amp;#034;,&amp;#034;);&#xD;
      //Serial.print(&amp;#034; Violet: &amp;#034;);&#xD;
      Serial.print(sensorValues[AS726x_VIOLET]);&#xD;
      Serial.print(&amp;#034;,&amp;#034;);&#xD;
      //Serial.print(&amp;#034; Blue: &amp;#034;);&#xD;
      Serial.print(sensorValues[AS726x_BLUE]);&#xD;
      Serial.print(&amp;#034;,&amp;#034;);&#xD;
      //Serial.print(&amp;#034; Green: &amp;#034;);&#xD;
      Serial.print(sensorValues[AS726x_GREEN]);&#xD;
      Serial.print(&amp;#034;,&amp;#034;);&#xD;
      //Serial.print(&amp;#034; Yellow: &amp;#034;);&#xD;
      Serial.print(sensorValues[AS726x_YELLOW]);&#xD;
      Serial.print(&amp;#034;,&amp;#034;);&#xD;
      //Serial.print(&amp;#034; Orange: &amp;#034;);&#xD;
      Serial.print(sensorValues[AS726x_ORANGE]);&#xD;
      Serial.print(&amp;#034;,&amp;#034;);&#xD;
      //Serial.print(&amp;#034; Red: &amp;#034;);&#xD;
      Serial.print(sensorValues[AS726x_RED]);&#xD;
      //Serial.print(&amp;#034;}&amp;#034;);&#xD;
    &#xD;
      Serial.println();&#xD;
      ;&#xD;
    }&#xD;
&#xD;
&#xD;
I have set up Baud speed to very high, but this makes no difference. Here is the Mathematica Notebook&#xD;
&#xD;
    dev = DeviceOpen[&amp;#034;Serial&amp;#034;, {&amp;#034;COM3&amp;#034;, &amp;#034;BaudRate&amp;#034; -&amp;gt; 115200}]&#xD;
    &#xD;
    parseData[{val1__, 44, val2__, 44, val3__, 44, val4__, 44, val5__, 44,&#xD;
        val6__}] := &#xD;
     ToExpression@&#xD;
        FromCharacterCode@# &amp;amp; /@ {{val1}, {val2}, {val3}, {val4}, {val5}, \&#xD;
    {val6}}&#xD;
    parseData[___] := Sequence[]&#xD;
    &#xD;
    rawReadings = {}&#xD;
    &#xD;
    Dynamic[ListLinePlot[Transpose[parseData /@ rawReadings], &#xD;
      PlotLegends -&amp;gt; Automatic]]&#xD;
    &#xD;
    DeviceClose[dev]</description>
    <dc:creator>Jose Calderon</dc:creator>
    <dc:date>2023-09-30T21:42:31Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3016653">
    <title>Mathematica  and Arduino  device does not capture the serial stream under dynamic</title>
    <link>https://community.wolfram.com/groups/-/m/t/3016653</link>
    <description>I have set up the following sketch to capture a serial feed from an arduino. But the Dynamic command only pick up 4 feeds and dies.  .&#xD;
&#xD;
he Arduino sketch is &#xD;
&#xD;
//*************************** // Credit original code to //  Aleksandr Berezutskii  //***************************&#xD;
&#xD;
    int raw1 = 0, raw2 = 0, raw3 = 0;&#xD;
    int x = 0, y1 = 0, y2 = 0, y3 = 0;&#xD;
    #define APin1 A11&#xD;
    #define APin2 A12&#xD;
    #define APin3 A13&#xD;
    void setup() &#xD;
    {&#xD;
    Serial.begin(9600);&#xD;
    pinMode( APin1, INPUT );&#xD;
    pinMode( APin2, INPUT );&#xD;
    pinMode( APin3, INPUT );&#xD;
    analogReference(DEFAULT);&#xD;
    }&#xD;
    &#xD;
    void loop() &#xD;
    {&#xD;
    while (x&amp;lt;=6000)&#xD;
    { &#xD;
    raw1 = analogRead( APin1 );&#xD;
    y1=raw1;&#xD;
    raw2 = analogRead( APin2 );&#xD;
    y2=raw2;&#xD;
    raw3 = analogRead( APin3 );&#xD;
    y3=raw3;&#xD;
    x++;               &#xD;
    Serial.print( y1 );&#xD;
    Serial.print(&amp;#034;\t&amp;#034;); &#xD;
    Serial.print( y2 );&#xD;
    Serial.print(&amp;#034;\t&amp;#034;);                &#xD;
    Serial.print( y3 );&#xD;
    Serial.println();&#xD;
    delay(400);&#xD;
    }&#xD;
    }&#xD;
&#xD;
The notepad is included here.&#xD;
&#xD;
&amp;amp;[Wolfram Notebook][1]&#xD;
&#xD;
&#xD;
&#xD;
  [1]: https://www.wolframcloud.com/obj/138756c1-8684-4ff5-841c-24dd2348e551</description>
    <dc:creator>Jose Calderon</dc:creator>
    <dc:date>2023-09-20T00:59:13Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/2714674">
    <title>Termi2 - a Typewriter That Answers Your Questions</title>
    <link>https://community.wolfram.com/groups/-/m/t/2714674</link>
    <description>![enter image description here][1]&#xD;
&#xD;
&amp;gt; Gizmodo: [This Question-Answering Typewriter Is Like if We Had Siri in the ’70s][2]&#xD;
 &#xD;
&amp;gt; Original articles: [Termi2 - a Typewriter That Answers Your Questions][3]&#xD;
&#xD;
&amp;gt; [Siri like it&amp;#039;s 1976 with a TI silent 700 terminal][4]&#xD;
&#xD;
What if a typewriter could respond to questions you enter?&#xD;
&#xD;
I answered that question [several years ago with a project I called Termi][5]. I salvaged a vintage TI Silent 700 electric typewriter/terminal (Model 745) and connected it to a Raspberry Pi Zero W that ran a script to query Wolfram Alpha. When the user typed a question into the typewriter, it would type out the answer ...like a 1976 version of Siri.&#xD;
&#xD;
For example, a simple exchange might look like:&#xD;
&#xD;
&amp;gt; Question: who is the president of the United States?  &#xD;
&amp;gt;  Answer: the current president of the United States is Joe Biden&#xD;
&#xD;
Termi2 is a reimagined version of that project, but better. I&amp;#039;m both reusing vintage hardware (the TI Silent 700) and the original idea in order to improve upon one of my favorite projects.&#xD;
&#xD;
**What&amp;#039;s changed?**&#xD;
&#xD;
The basic concept is still the same: the user types a question, then Wolfram Alpha answers that question and the response automatically types out.&#xD;
&#xD;
But all of the hardware, aside from the TI Silent 700 itself, is different. I realized that an SBC (Single-Board Computer) was overkill for this project and introduced unnecessary complications. For example, it required that the user log into the Linux terminal at startup, took a while to boot, and necessitated a specific question command structure and some strange formatting.&#xD;
&#xD;
Termi2 now uses an ESP32 to handle the same functionality in a much more streamlined way. When powered on, it takes just a few seconds to connect to WiFi and prompt the user for a question. The user can type that question any way they like&amp;#x2014;no special commands or formatting necessary. Within a few seconds, a short answer from Wolfram Alpha (which can process a wide range of queries) will print out.&#xD;
&#xD;
The new hardware also eliminates the need for the Arduino adapter I created for the original and runs on a lithium battery, so no additional power adapter is needed.&#xD;
&#xD;
&amp;amp;[Wolfram Notebook][6]&#xD;
&#xD;
##Supplies&#xD;
&#xD;
**Components:**&#xD;
&#xD;
- TI Silent 700 Terminal (Model 745)&#xD;
- ESP32 Development Board&#xD;
- SN74LVC245A level shifter IC&#xD;
- Battery charging/distribution module&#xD;
- Lithium-ion battery (between 250-1000mAh should work)&#xD;
- Power switch&#xD;
- Female DA-15 connector&#xD;
- Perfboard&#xD;
&#xD;
**Supplies:**&#xD;
&#xD;
- Soldering iron&#xD;
- 3D printer&#xD;
- Computer (for programming ESP32)&#xD;
- Hot glue gun&#xD;
- Wire&#xD;
&#xD;
##Step 1: The TI Silent 700 Explained&#xD;
&#xD;
![enter image description here][7]&#xD;
&#xD;
The TI Silent 700 is a strange device by modern standards. It looks like an electric typewriter and operates as such. TI even advertised it that way.&#xD;
&#xD;
But it isn&amp;#039;t *just* a typewriter; it is also a computer terminal. It isn&amp;#039;t a standalone computer and can&amp;#039;t process anything on its own, but rather acts as an interface for a computer.&#xD;
&#xD;
In the 1970s, computers were big, expensive, and often shared among multiple users. In many ways, the kinds of high-end computers that businesses and universities used were more like what we think of as servers today. Like most modern servers, those vintage computers were often headless (meaning they didn&amp;#039;t have their own monitor and keyboard). To work with them, could connect a terminal to input data into a computer and receive the output. That was especially useful when working with remote computers.&#xD;
&#xD;
In this case, when the TI Silent 700 is in online mode it will send anything typed on its keyboard to a connected computer. Optionally, it will also print the typed characters directly onto the paper like a normal electric typewriter. Anything the connected computer returns will print out on the paper via the same typewriter mechanism (a thermal printhead).&#xD;
&#xD;
This specific model, the 745, could connect to connects through a serial port or an acoustic coupler. The latter works with primitive modems and accepts a telephone handset. The TI Silent 700&amp;#039;s speaker would beep and chirp into the handset to send data, and its microphone would listen for beeps and chirps to receive data.&#xD;
&#xD;
The serial port enables more conventional local communication and is what I used for this project. Data transfer is very slow and there are no advanced handshake features, but the serial communication is straightforward.&#xD;
&#xD;
Of note, this model can only output uppercase letters. That made it difficult to use with Linux, which meant that I had to utilize some creative workarounds for the original Termi project.&#xD;
&#xD;
##Step 2: TI Silent 700 Serial Communication&#xD;
&#xD;
![enter image description here][8]&#xD;
&#xD;
The most important thing to know when trying to setup serial communication with a TI Silent 700 is that the logic is inverted&amp;#x2014;voltage between -15V and -3V is a 1 (one, TRUE), and voltage between +3V and +15V is a 0 (zero, FALSE). This is the opposite logic of most modern serial communication.&#xD;
&#xD;
This means that, unless you correct for it, when the TI Silent 700 sends what it thinks is a 1, the receiving computer will likely receive a 0 (and vice-versa). The data will still send, but it will appear to be random characters.&#xD;
&#xD;
There are a few ways to correct for this. If the device supports it (as the ESP32 does), you can simply setup the serial connection with inverted logic on both RX and TX. You can also use a hex inverter IC chip, which has multiple input/output pairs that invert logic.&#xD;
&#xD;
The other serial data settings are straightforward. The TI Silent 700 requires:&#xD;
&#xD;
- 7 data bits&#xD;
- 1 stop bit&#xD;
- Odd parity bit (apparently even also works)&#xD;
- No flow control&#xD;
&#xD;
The Model 745 can print at either 30 characters a second or 10 characters a second. The former requires 300 baud and the latter requires 100 baud.&#xD;
&#xD;
There is also a switch for duplex mode. I use half duplex, which means it can only receive or send data at any given time. But that will also print everything the user types (something I wanted). In full duplex, the TI Silent 700 will only print data it receives over serial (not what the user types, unless the receiver echoes that).&#xD;
&#xD;
**The Serial Port**&#xD;
&#xD;
I&amp;#039;m calling it a serial port, but that isn&amp;#039;t actually what it is. It is actually a proprietary port that has pins for two separate serial connections (one for the acoustic coupler, one for normal serial communication).&#xD;
&#xD;
That port accepts a female DA-15 connector with 15 pins arranged in two rows. Looking at the TI Silent 700&amp;#039;s port, the top left pin is Pin 1 and the bottom right pin is Pin 15.&#xD;
&#xD;
The pictured page from the manual shows the pin functions (with their proprietary cable adapter). We won&amp;#039;t need the adapter, because we&amp;#039;re going to connect to the pins ourselves.&#xD;
&#xD;
Here are the connections I used:&#xD;
&#xD;
- Pin 1 &amp;gt; Ground&#xD;
- Pin 11 &amp;gt; 5V&#xD;
- Pin 12 &amp;gt; RX&#xD;
- Pin 13 &amp;gt; TX&#xD;
&#xD;
Pin 11 needs to receive steady voltage for the TI Silent 700 to register that it is connected to something. If it doesn&amp;#039;t, it will refuse to send or receive data.&#xD;
&#xD;
**Level Shifting**&#xD;
&#xD;
The TI Silent 700 considers anything between -3V and 3V to be null&amp;#x2014;it isn&amp;#039;t a 1 or a 0. And it outputs at somewhere between 5V and 8V.&#xD;
&#xD;
But the ESP32&amp;#039;s pins cannot handle anything over 3.3V. It also outputs at 3.3V, which is enough for the TI Silent 700 to detect.&#xD;
&#xD;
To avoid damaging the ESP32, the output from the TI Silent 700 needs to come down to acceptable voltage. This is the job of the SN74LVC245A level shifter IC. It brings inputs down to whatever voltage it is supplied with and outputs them at that voltage. So if we supply it with 3.3V, it will take the high-voltage output from the TI Silent 700 and bring it down to 3.3V that is acceptable for the ESP32.&#xD;
&#xD;
##Step 3: ESP32 Wiring&#xD;
&#xD;
![enter image description here][9]&#xD;
&#xD;
ESP32 modules are available on different development boards without different pinouts. I used this ESP-WROOM-32 development board, which seems to have the most common pinout.&#xD;
&#xD;
You can see in the Fritzing schematic how everything is connected, but I&amp;#039;ll cover it all here in detail.&#xD;
&#xD;
Connections to the ESP32&amp;#039;s pins:&#xD;
&#xD;
- GND &amp;gt; ground for everything&#xD;
- VIN &amp;gt; 5V from battery, 5V to Pin 11 on the TI Silent 700&#xD;
- 3V3 &amp;gt; to level shifter&#xD;
- RX2 &amp;gt; to level shifter output from TI Silent 700&amp;#039;s Pin 13 TX output&#xD;
- TX2 &amp;gt; to Pin 12 on TI Silent 700&#xD;
&#xD;
Connections to the SN74LVC245A&amp;#039;s pins:&#xD;
&#xD;
- Pin 1 (DIR) &amp;gt; 3.3V from ESP32&#xD;
- Pin 20 (Vcc) &amp;gt; 3.3V from ESP32&#xD;
- Pin 2 (A1) &amp;gt; TX from Silent 700&#xD;
- Pin 10 (GND) &amp;gt; Ground&#xD;
- Pin 19 (OE) &amp;gt; Ground&#xD;
- Pin 18 (B1) &amp;gt; TX output to ESP32&#xD;
&#xD;
Connections to the DA-15 connector:&#xD;
&#xD;
- Pin 1 &amp;gt; Ground&#xD;
- Pin 11 &amp;gt; 5V&#xD;
- Pin 12 &amp;gt; RX&#xD;
- Pin 13 &amp;gt; TX&#xD;
&#xD;
The battery charging/power distribution module will depend on your particular model, but it should be pretty simple. Connect the battery&amp;#039;s + and - leads to the module&amp;#039;s + and - pads. Then the output + pad goes to the ESP32&amp;#039;s VIN pin (through a power switch) and the - pad goes to the ESP32&amp;#039;s GND pin.&#xD;
&#xD;
##Step 4: ESP32 Code&#xD;
&#xD;
The code for the ESP32 (which I wrote in MicroPython) needs to do a few things:&#xD;
&#xD;
 1. Connect to WiFi&#xD;
 2. Listen for incoming data&#xD;
 3. Understand when the user finishes their query&#xD;
 4. Format the query&#xD;
 5. Send the query to the Wolfram Alpha API&#xD;
 6. Receive answer from Wolfram Alpha&#xD;
 7. Send the answer data to the TI Silent 700 for printing&#xD;
 8. Wait for a new query&#xD;
&#xD;
I&amp;#039;ll explain how I went about accomplishing each step below. I&amp;#039;ve also fully commented the code, which is attached here.&#xD;
&#xD;
**Connect to WiFi**&#xD;
&#xD;
Connecting to WiFi is easy&amp;#x2014;that&amp;#039;s the whole purpose of the ESP32 and MicroPython makes it simple.&#xD;
&#xD;
The easiest way is to hardcode your WiFi credentials, but I didn&amp;#039;t go that route. Initially, I wanted the user to be able to type in their WiFi credentials using the TI Silent 700 and have the ESP32 store them. That would make it easy to connect to new networks. For that reason, I set it up so that the WiFi credentials are stored in a simple text file in flash memory.&#xD;
&#xD;
No, that isn&amp;#039;t at all secure. If you&amp;#039;re concerned about WiFi security (which you probably should be), you&amp;#039;ll want to go a more secure route. But hardcoding the WiFi credentials in MicroPython isn&amp;#039;t secure, either. In fact, there aren&amp;#039;t many ways to secure the credentials on an ESP32.&#xD;
&#xD;
Unfortunately, the TI Silent 700 can only output uppercase and that made it very difficult to allow users to type in their credentials. How do you let them type an SSID or password that contains lowercase letters (or other characters not on the TI Silent 700&amp;#039;s keyboard)? There are workarounds, such as letting the user also input a sort of map of cases, but I decided to just nix that feature. So to change network credentials, one has to plug the ESP32 into a computer and alter the text file.&#xD;
&#xD;
The code simply grabs those credentials and attempts to connect to WiFi for a while. If it isn&amp;#039;t able to (or if the file isn&amp;#039;t present), then it will print an error message on the TI Silent 700.&#xD;
&#xD;
**Listen for incoming data**&#xD;
&#xD;
The code simply runs a loop where it checks for incoming bytes.&#xD;
&#xD;
Once it receives a byte, it decodes it (as UTF-8) and then saves it as a string (which should only contain one character). It then adds that string to the query string that contains all of the received characters.&#xD;
&#xD;
**Understand when the user finishes the query**&#xD;
&#xD;
When the user presses the &amp;#034;RETURN&amp;#034; key on the TI Silent 700, it sends a byte for a carriage return. This is what we want to detect to determine when the user has entered their query and wants an answer.&#xD;
&#xD;
But their is problem: when decoded and converted to a string, the carriage return byte doesn&amp;#039;t look like anything. It isn&amp;#039;t a character we can scan for.&#xD;
&#xD;
The solution was to look at every byte that comes in and check to see if it matches a carriage return byte. It does that before converting the new byte to a character and adding it to the query string.&#xD;
&#xD;
If the incoming byte is a carriage return, it breaks the loop and passes the query string on. If it isn&amp;#039;t a carriage return, it simply adds the new character to the query string as normal.&#xD;
&#xD;
**Format the query**&#xD;
&#xD;
The Wolfram Alpha Short Answers API (which returns simple answers perfect for this project) requires a URL request formatted like this:&#xD;
&#xD;
    http://api.wolframalpha.com/v1/result?appid=DEMO&amp;amp;i=How+far+is+Los+Angeles+from+New+York%3f&#xD;
&#xD;
But the query as input by the user might look something like:&#xD;
&#xD;
&amp;gt; What is today&amp;#039;s date?&#xD;
&#xD;
The spaces, apostrophe, and question mark won&amp;#039;t work in this format.&#xD;
&#xD;
So the code processes the query string to remove all the spaces and special characters, then adds it to the URL for the request.&#xD;
&#xD;
**Send the query to Wolfram Alpha**&#xD;
&#xD;
MicroPython makes this easy. All we have to do is send a GET Request to the URL.&#xD;
&#xD;
**Receive answer from Wolfram Alpha**&#xD;
&#xD;
This is also easy. When we send the GET Request, the return will be the short answer.&#xD;
&#xD;
**Send the answer data to the TI Silent 700 for printing**&#xD;
&#xD;
All we have to do to print something on the TI Silent 700 is send it some data. But we want to do that one character at a time. So we cycle through a loop for each character in the answer string, writing that character to the UART (serial) port.&#xD;
&#xD;
But there is one complication: the TI Silent 700 is bad at understanding when it can&amp;#039;t print any additional characters on a line. So the loop also checks if it has printed more than 75 characters (index 74). If it has, then it will send both an two newlines (&amp;#034;\n&amp;#034; to advance to the next line) and a carriage return (&amp;#034;\r&amp;#034; to move back to the beginning of the line).&#xD;
&#xD;
The reason it sends two newlines instead of just one is practical. My particular machine doesn&amp;#039;t seem to feed paper quite as well as it should, so this compensates for that. It may not be necessary for other machines.&#xD;
&#xD;
**Wait for a new query**&#xD;
&#xD;
After printing the answer, the code just moves back to the loop where it waits for incoming bytes. This lets users continue to ask questions without ever having to reset anything. As long as there is still paper on the roll, it will continue answering questions as long as it as power and WiFi is working.&#xD;
&#xD;
**Step 5: Using Wolfram Alpha&amp;#039;s API**&#xD;
&#xD;
Wolfram Alpha is really cool&amp;#x2014;I&amp;#039;m a huge fan.&#xD;
&#xD;
If you aren&amp;#039;t familiar, Wolfram Alpha is a bit like a search engine mixed with a math processor, with a dash of virtual assistant (like Siri or Alexa) thrown in. It can handle things like mathematical formulas, but it also does natural language processing (NLP) and can answer a huge range of questions. If Siri or Alexa can answer it, there is a good chance that Wolfram Alpha can, too.&#xD;
&#xD;
The best part is that Wolfram Alpha has an API (Application Programming Interface) that is easy to use and free for things like hobby projects.&#xD;
&#xD;
There are different API calls one can make, but we&amp;#039;re interested in the &amp;#034;Short Answers API&amp;#034; that returns just a sentence or two in plain text. That is exactly what we want for this project.&#xD;
&#xD;
Instructions on using it are here:  &#xD;
https://products.wolframalpha.com/short-answers-api/documentation&#xD;
&#xD;
**Basically you just need to sign up for a free account, create an API application, and then plug your APP ID into the MicroPython code I provided.**&#xD;
&#xD;
##Step 6: Setup WiFi&#xD;
&#xD;
All you need to do to get the ESP32 connected to WiFi using my MicroPython code is create a text file in its flash memory called &amp;#034;creds.txt&amp;#034; and then enter your SSID and password as a single line with a comma between, like this:&#xD;
&#xD;
    Your_Network_SSID,Your_Password&#xD;
&#xD;
Nothing else should be in the file and it shouldn&amp;#039;t have any spaces.&#xD;
&#xD;
If you don&amp;#039;t know what I mean by putting the file in flash memory or haven&amp;#039;t yet installed MicroPython on your ESP32, this site has some good instructions:  &#xD;
https://randomnerdtutorials.com/getting-started-micropython-esp32-esp8266/&#xD;
&#xD;
##Step 7: Assembly&#xD;
&#xD;
![enter image description here][10]&#xD;
&#xD;
I&amp;#039;ve designed Termi as a self-contained module that plugs into the TI Silent 700&amp;#039;s serial port.&#xD;
&#xD;
I will probably redesign this in the near future to utilize a custom PCB and a nicer enclosure, which will make it look much nicer and far more compact. But for now it&amp;#039;s all on a stripboard.&#xD;
&#xD;
The stripboard I used is 70x50mm, which is important for making it fit in the 3D-printed case.&#xD;
&#xD;
For the wiring, you&amp;#039;ll want to reference the schematic and connections back in Step 3.&#xD;
&#xD;
I got a little sloppy with the CAD work, since I&amp;#039;m planning on redoing it after designing a real PCB. So hot glue is holding all of the components in place inside the case.&#xD;
&#xD;
The lid fastens to the main case using M3 screws in heat-set inserts.&#xD;
&#xD;
##Step 8: Using Termi2&#xD;
&#xD;
To use it, you just plug it in, turn on the TI Silent 700, and then turn on the module. Make sure the TI Silent 700 is set to online, half-duplex, and not low-speed.&#xD;
&#xD;
After a few seconds for the WiFi to connected, the TI Silent 700 should print out:&#xD;
&#xD;
    ASK TERMI2:&#xD;
&#xD;
You can then type in whatever question you want, with or without a question mark, and then press the return key.&#xD;
&#xD;
After a few seconds for Wolfram Alpha to process the request and send the answer back, the TI Silent 700 will print the results and then prompt you to ask another question.&#xD;
&#xD;
That&amp;#039;s it! Siri like it&amp;#039;s 1976 ..again.&#xD;
&#xD;
This is a project I&amp;#039;m very proud of. It&amp;#039;s awesome to make an old, obsolete piece of technology that would normally end up as e-waste into something useful and fun. Everyone who sees it loves it, because there is something fun about vintage hardware printing internet knowledge onto paper.&#xD;
&#xD;
&#xD;
  [1]: https://community.wolfram.com//c/portal/getImageAttachment?filename=termi2_2.gif&amp;amp;userId=20103&#xD;
  [2]: https://www.gizmodo.com.au/2022/11/this-question-answering-typewriter-is-like-if-we-had-siri-in-the-70s/&#xD;
  [3]: https://www.instructables.com/Termi2-a-Typewriter-That-Answers-Your-Questions/&#xD;
  [4]: https://medium.com/cameron-coward/siri-like-its-1976-with-a-ti-silent-700-terminal-79da04ab6651&#xD;
  [5]: https://medium.com/cameron-coward/siri-like-its-1976-with-a-ti-silent-700-terminal-79da04ab6651&#xD;
  [6]: https://www.wolframcloud.com/obj/9a13ba06-381d-463f-9558-6088d4fb41df&#xD;
  [7]: https://community.wolfram.com//c/portal/getImageAttachment?filename=collage1_1.png&amp;amp;userId=20103&#xD;
  [8]: https://community.wolfram.com//c/portal/getImageAttachment?filename=FSP1XTNLAPDDN8M.png&amp;amp;userId=20103&#xD;
  [9]: https://community.wolfram.com//c/portal/getImageAttachment?filename=collage1_2.png&amp;amp;userId=20103&#xD;
  [10]: https://community.wolfram.com//c/portal/getImageAttachment?filename=collage1.3_small.png&amp;amp;userId=20103</description>
    <dc:creator>Cameron Coward</dc:creator>
    <dc:date>2022-12-02T18:24:35Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/2680377">
    <title>Game controller button to trigger action</title>
    <link>https://community.wolfram.com/groups/-/m/t/2680377</link>
    <description>This should not be that difficult, but I&amp;#039;m not seeing the solution. I have a game controller, and in a notebook on my desktop some WL code. The controller sends a &amp;#034;button push&amp;#034; signal to the code just fine, captured by the code in the notebook with a line like this:&#xD;
&#xD;
    Dynamic[ControllerState[2, &amp;#034;B4&amp;#034;]]&#xD;
&#xD;
However, I would like this to dynamically trigger a function in the code, similar to the way an event handler would work. To simplify things, let&amp;#039;s just have it trigger `Beep[]` when the button is pushed. I could set a timer to repeatedly check the value of the ControllerState, but that can&amp;#039;t be the best way to do it. The code is not part of a Manipulate or 3Dgraphics, but rather part of a custom interface.&#xD;
&#xD;
Can anyone please point me in the right direction?&#xD;
&#xD;
Thanks in advance.</description>
    <dc:creator>Mark Greenberg</dc:creator>
    <dc:date>2022-11-01T18:19:24Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/2623336">
    <title>Using the ADALM-PLUTO with Mathematica?</title>
    <link>https://community.wolfram.com/groups/-/m/t/2623336</link>
    <description>Is there any possibility of using the ADALM-PLUTO with Mathematica? Analog Devices provides support for Matlab, but I wonder if it can be used in Mathematica as well. To complicate things more on macOS arm64.</description>
    <dc:creator>Codrut Popescu</dc:creator>
    <dc:date>2022-09-25T21:18:51Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/2602822">
    <title>Arduino connectivity error with DeviceOpen?</title>
    <link>https://community.wolfram.com/groups/-/m/t/2602822</link>
    <description>Hi,&#xD;
a error message appears when opening a serial connection with an arduino uno.&#xD;
&#xD;
    arduinoCCD = DeviceOpen[&amp;#034;Arduino&amp;#034;, &amp;#034;COM9&amp;#034;]&#xD;
&#xD;
The error message is then :&#xD;
&#xD;
    ArduinoUpload`arduinoIndividualUpload::sizeFail: Checking the size of the sketch with avr-size failed with code 1 and output C:\Users\Eble\AppData\Roaming\Mathematica\ApplicationData\Arduino\arduino\hardware\tools\avr\bin\avr-size.exe: &amp;#039;&amp;#034;C:\Users\Eble\AppData\Local\Temp\arduinocompiled9ec104f74a246938788595e6ec6ae01\SketchTemplate.cpp.hex&amp;#034;&amp;#039;: No such file&#xD;
   &#xD;
and&#xD;
 DeviceConfigure::uploadfail: Uploading of the sketch failed. Halting&#xD;
&#xD;
DeviceExecute[] and DeviceConfigure[] can not be used.&#xD;
&#xD;
Does anyone have an idea?&#xD;
&#xD;
Thank you.</description>
    <dc:creator>Benoit Eble</dc:creator>
    <dc:date>2022-08-22T13:31:16Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/2565873">
    <title>CCD astronomical imaging: image acquisition</title>
    <link>https://community.wolfram.com/groups/-/m/t/2565873</link>
    <description>&amp;amp;[Wolfram Notebook][1]&#xD;
&#xD;
&#xD;
  [1]: https://www.wolframcloud.com/obj/d190246a-cbf2-4c37-8437-a9d5f7a60adc</description>
    <dc:creator>Tom Sherlock</dc:creator>
    <dc:date>2022-07-07T15:40:30Z</dc:date>
  </item>
</rdf:RDF>

