{"id":271,"date":"2026-06-20T22:36:41","date_gmt":"2026-06-20T21:36:41","guid":{"rendered":"https:\/\/myjetsonnano.perseus314.com\/?p=271"},"modified":"2026-06-26T22:53:11","modified_gmt":"2026-06-26T21:53:11","slug":"grove-mp3-player","status":"publish","type":"post","link":"https:\/\/myjetsonnano.perseus314.com\/index.php\/2026\/06\/20\/grove-mp3-player\/","title":{"rendered":"Grove MP3 player"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Python code for AtomS3U, working to play first track in root directory<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import os, sys, io\nimport M5\nfrom M5 import *\nimport time\nfrom hardware import UART\n\nuart1 = None\n\nstr2 = None\nname = None\nnumber = None\nok = None\ncommand = None\nmsg = None\npm = None\nbytes2 = None\nreply = None\n\n# Describe this function...\ndef WriteMP3Player(str2):\n  global name, number, ok, command, msg, pm, bytes2, reply, uart1\n  ok = False\n  print(str2)\n  uart1.write((str2.encode()))\n  return True\n\n# Describe this function...\ndef getReply():\n  global str2, name, number, ok, command, msg, pm, bytes2, reply, uart1\n  time.sleep(1)\n  msg = bytearray(100)\n  while uart1.any():\n    bytes2 = uart1.read()\n    msg = msg + bytes2\n    time.sleep_ms(100)\n  return (msg.decode()).strip()\n\n# Describe this function...\ndef prettyPrintReply(str2):\n  global name, number, ok, command, msg, pm, bytes2, reply, uart1\n  print(str((len(str2))))\n  print(str2)\n  if str2 == 'ERR:1':\n    print('error 1 received')\n\n# Describe this function...\ndef playByName(name):\n  global str2, number, ok, command, msg, pm, bytes2, reply, uart1\n  command = 'AT+SPLAY=sd0,'\n  command = command + name\n  ok = WriteMP3Player(command)\n  reply = getReply()\n\n# Describe this function...\ndef playByNumber(number):\n  global str2, name, ok, command, msg, pm, bytes2, reply, uart1\n  command = 'AT+PLAY=sd0,'\n  command = command + (str(number))\n  ok = WriteMP3Player(command)\n  reply = getReply()\n\n\ndef setup():\n  global uart1, ok, command, msg, str2, pm, bytes2, name, reply, number\n\n  M5.begin()\n  uart1 = UART(1, baudrate=115200, bits=8, parity=None, stop=1, tx=2, rx=1)\n  pm = 0\n  msg = ''\n\n\ndef loop():\n  global uart1, ok, command, msg, str2, pm, bytes2, name, reply, number\n  M5.update()\n  if pm == 0:\n    ok = WriteMP3Player('AT+BAUD?')\n    reply = getReply()\n    print(reply)\n    pm = pm + 1\n  if pm == 1:\n    ok = WriteMP3Player('AT+GVER?')\n    reply = getReply()\n    print(reply)\n    pm = pm + 1\n  if pm == 2:\n    ok = WriteMP3Player('AT+GCFGVER?')\n    reply = getReply()\n    print(reply)\n    prettyPrintReply(reply)\n    pm = pm + 1\n  if pm == 3:\n    playByNumber(3)\n    reply = getReply()\n    print(reply)\n    prettyPrintReply(reply)\n    pm = pm + 1\n  if pm == 4:\n    ok = WriteMP3Player('AT+REPEATMODE=4')\n    reply = getReply()\n    print(reply)\n    prettyPrintReply(reply)\n    pm = pm + 1\n  if pm == 5:\n    ok = WriteMP3Player('AT+VOL=3')\n    reply = getReply()\n    print(reply)\n    prettyPrintReply(reply)\n    pm = pm + 1\n\n\nif __name__ == '__main__':\n  try:\n    setup()\n    while True:\n      loop()\n  except (Exception, KeyboardInterrupt) as e:\n    try:\n      from utility import print_error_msg\n      print_error_msg(e)\n    except ImportError:\n      print(\"please update to latest firmware\")\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Arduino test sketch<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/static-cdn.m5stack.com\/resource\/arduino\/package_m5stack_index.json\">https:\/\/static-cdn.m5stack.com\/resource\/arduino\/package_m5stack_index.json<\/a><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;M5Unified.h>\n\n\/\/ Hardware Serial 1 configuration\nHardwareSerial uart1(1); \nconst int RX_PIN = 1;\nconst int TX_PIN = 2;\n\n\/\/ Global Variables\nbool ok = false;\nString str2 = \"\";\nString name = \"\";\nint number = 0;\nString command = \"\";\nString msg = \"\";\nint pm = 0;\nString reply = \"\";\n\n\/\/ Forward declarations of functions\nbool WriteMP3Player(String str2);\nString getReply();\nvoid prettyPrintReply(String str2);\nvoid playByName(String name);\nvoid playByNumber(int number);\n\nvoid setup() {\n  \/\/ Initialize the M5 device\n  auto cfg = M5.config();\n  M5.begin(cfg);\n  \n  \/\/ Initialize standard Serial for debug printing to PC\n  Serial.begin(115200);\n  \n  \/\/ Initialize UART1 for the MP3 player (Baud rate, Config, RX Pin, TX Pin)\n  uart1.begin(115200, SERIAL_8N1, RX_PIN, TX_PIN);\n  \n  pm = 0;\n  msg = \"\";\n}\n\nvoid loop() {\n  M5.update();\n  \n  if (pm == 0) {\n    ok = WriteMP3Player(\"AT+BAUD?\");\n    reply = getReply();\n    Serial.println(reply);\n    pm = pm + 1;\n  }\n  else if (pm == 1) {\n    ok = WriteMP3Player(\"AT+GVER?\");\n    reply = getReply();\n    Serial.println(reply);\n    pm = pm + 1;\n  }\n  else if (pm == 2) {\n    ok = WriteMP3Player(\"AT+GCFGVER?\");\n    reply = getReply();\n    Serial.println(reply);\n    prettyPrintReply(reply);\n    pm = pm + 1;\n  }\n  else if (pm == 3) {\n    playByNumber(3);\n    reply = getReply();\n    Serial.println(reply);\n    prettyPrintReply(reply);\n    pm = pm + 1;\n  }\n  else if (pm == 4) {\n    ok = WriteMP3Player(\"AT+REPEATMODE=4\");\n    reply = getReply();\n    Serial.println(reply);\n    prettyPrintReply(reply);\n    pm = pm + 1;\n  }\n  else if (pm == 5) {\n    ok = WriteMP3Player(\"AT+VOL=3\");\n    reply = getReply();\n    Serial.println(reply);\n    prettyPrintReply(reply);\n    pm = pm + 1;\n  }\n}\n\n\/\/ Function to write data to the MP3 Player over UART\nbool WriteMP3Player(String str2) {\n  ok = false;\n  Serial.println(str2); \/\/ Print to computer console for debugging\n  uart1.print(str2);    \/\/ Send AT command to MP3 Player\n  return true;\n}\n\n\/\/ Function to gather responses from the MP3 Player\nString getReply() {\n  delay(1000); \/\/ Wait 1 second for device to start processing\n  msg = \"\";\n  \n  while (uart1.available()) {\n    char c = uart1.read();\n    msg += c;\n    delay(10); \/\/ Short delay to let next byte arrive in buffer\n  }\n  \n  msg.trim(); \/\/ Removes whitespace\/newlines from ends (equivalent to .strip())\n  return msg;\n}\n\n\/\/ Function to print details about the reply\nvoid prettyPrintReply(String str2) {\n  Serial.println(str2.length());\n  Serial.println(str2);\n  if (str2 == \"ERR:1\") {\n    Serial.println(\"error 1 received\");\n  }\n}\n\n\/\/ Function to play a track by its string name\nvoid playByName(String name) {\n  command = \"AT+SPLAY=sd0,\";\n  command = command + name;\n  ok = WriteMP3Player(command);\n  reply = getReply();\n}\n\n\/\/ Function to play a track by its index number\nvoid playByNumber(int number) {\n  command = \"AT+PLAY=sd0,\";\n  command = command + String(number);\n  ok = WriteMP3Player(command);\n  reply = getReply();\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Python code for AtomS3U, working to play first track in root directory Arduino test sketch https:\/\/static-cdn.m5stack.com\/resource\/arduino\/package_m5stack_index.json<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-271","post","type-post","status-publish","format-standard","hentry","category-uncategorised"],"_links":{"self":[{"href":"https:\/\/myjetsonnano.perseus314.com\/index.php\/wp-json\/wp\/v2\/posts\/271","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/myjetsonnano.perseus314.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/myjetsonnano.perseus314.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/myjetsonnano.perseus314.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/myjetsonnano.perseus314.com\/index.php\/wp-json\/wp\/v2\/comments?post=271"}],"version-history":[{"count":7,"href":"https:\/\/myjetsonnano.perseus314.com\/index.php\/wp-json\/wp\/v2\/posts\/271\/revisions"}],"predecessor-version":[{"id":284,"href":"https:\/\/myjetsonnano.perseus314.com\/index.php\/wp-json\/wp\/v2\/posts\/271\/revisions\/284"}],"wp:attachment":[{"href":"https:\/\/myjetsonnano.perseus314.com\/index.php\/wp-json\/wp\/v2\/media?parent=271"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/myjetsonnano.perseus314.com\/index.php\/wp-json\/wp\/v2\/categories?post=271"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/myjetsonnano.perseus314.com\/index.php\/wp-json\/wp\/v2\/tags?post=271"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}